分布式事务解决方案——柔性事务与服务模式

转载自   分布式事务解决方案——柔性事务与服务模式

初识分布式系统

关于分布式一致性的探究

分布式系统的CAP理论(需要到博客中查看)

分布式系统的BASE理论(需要到博客中查看)

Java中的事务——JDBC事务和JTA事务

Java中的事务——全局事务与本地事务

关于分布式事务、两阶段提交协议、三阶提交协议

深入理解分布式系统的2PC和3PC

这里简单总结下以前几篇文章,算是本文的背景知识。在分布式系统中,存在CAP理论,即可用性、数据一致性和分区容错性无法同时满足。所以,一个基于CAP的最终一致性理论BASE理论是目前解决分布式问题比较靠谱的。

在分布式系统中,是无法使用本地事务保证数据的一致性的。一种标准的分布式事务就是全局事务(DTP模型)。他是基于2PC来控制的。但是由于2PC自身就存在同步阻塞的问题,这也就导致全局事务效率很低。所以,这种全局事务并不适合解决大型网站的分布式事务问题。

 

柔性事务

在业内,主要用来解决分布式事务的方案是使用柔性事务。所谓柔性事务,相比较与数据库事务中的ACID这种刚性事务来说,柔性事务保证的是“基本可用,最终一致。”这其实就是基于BASE理论,保证数据的最终一致性。

虽然柔性事务并不像刚性事务那样完全遵循ACID,但是,也是部分遵循ACID的,简单看一下关于ACID四个属性,柔性事务的支撑程度:

原子性:严格遵循

一致性:事务完成后的一致性严格遵循;事务中的一致性可适当放宽

隔离性:并行事务间不可影响;事务中间结果可见性允许安全放宽

持久性:严格遵循

 

 

柔性事务的基础

前面介绍过了柔性事务的定义,目前,在业内,关于柔性事务,最主要的有以下三种类型:异步确保型、补偿型、最大努力通知型。

这三种类型的柔性事务基本都有对应的实现,不同的场景需要使用不同的柔性事务类型。而这几种柔性事务类型,其实还是依赖一些基础模式的,或者叫做基础接口,基础功能。

比如,要想使用可靠消息最终一致来实现异步确保型柔性事务,就依赖接幂等操作和可查询操作。关于具体实现,我们在后面的文章中介绍,本文简单介绍下这些实现柔性事务依赖的基础模式。

注意,下面要介绍的柔性事务的模式,并不是柔性事务的方案。这些是做柔性事务的基础。也就是说,如果你想做柔性事务,你的接口和功能要满足下面的几个要求。不一定要都满足,因为不同的方案的要求不一样。但是都不满足的话,是不可能做柔性事务的。

可查询操作

可查询操作,几乎是所有的分布式解决方案都需要的。

举一个常见的分布式场景的例子,如订单处理这一功能:

/** 支付订单处理 **/
public void completeOrder() {orderDao.update(); // 订单服务本地更新订单状态accountService.update(); // 调用资金账户服务给资金帐户加款pointService.update(); // 调用积分服务给积分帐户增加积分accountingService.insert(); // 调用会计服务向会计系统写入会计原始凭证merchantNotifyService.notify(); // 调用商户通知服务向商户发送支付结果通知
}

以上这个支付订单处理的例子中,除了订单服务本地更新订单状态以外的所有操作,都需要调用RPC接口来执行,这种情况单纯的本地事务就无法保证数据的一致性了。就需要引入分布式事务。在分布式事务执行过程中,如果某一个步骤执行出错,就需要明确的知道其他几个操作的处理情况,这就需要其他的服务都能够提供查询接口,保证可以通过查询来判断操作的处理情况。

 

为了保证操作的可查询,需要对于每一个服务的每一次调用都有一个全局唯一的标识,可以是业务单据号(如订单号)、也可以是系统分配的操作流水号(如支付记录流水号)。除此之外,操作的时间信息也要有完整的记录。

幂等操作

幂等性,其实是一个数学概念。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数,如:

f(f(x)) = f(x)

在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。也就是说,同一个方法,使用同样的参数,调用多次产生的业务结果与调用一次产生的业务结果相同。

 

这一个要求其实也比较好理解,因为要保证数据的最终一致性,很多解决防范都会有很多重试的操作,如果一个方法不保证幂等,那么将无法被重试。

幂等操作的实现方式有多种,如在系统中缓存所有的请求与处理结果、检测到重复操作后,直接返回上一次的处理结果等。

可补偿操作

提到事务,为了保证原子性,就可能发生commit和rollback,那么在分布式事务中,要想进行rollback,就需要提供可补偿操作。

 

比如上面的订单处理的例子中,在调用积分服务给积分帐户增加积分操作执行之后,经过分布式事务协调,最终决定回滚整个事务,那么就需要提供一个调用积分服务给积分帐户扣减积分的操作。

并且,补偿操作同时也需要满足幂等性。

TCC操作

TCC 即 Try-Confirm-Cancel。

 

Try: 尝试执行业务

完成所有业务检查(一致性) 预留必须业务资源(准隔离性)

Confirm:确认执行业务

真正执行业务 不作任何业务检查 只使用Try阶段预留的业务资源 Confirm操作要满足幂等性

Cancel: 取消执行业务

释放Try阶段预留的业务资源  
Cancel操作要满足幂等性

这种类型和可补偿操作类似,就是提供一种提交和回滚的机制。是一种典型的两阶段类型的操作。这里说的两阶段类型操作并不是指2PC,他和2PC还是有区别的。

TCC与2PC协议比较 

TCC位于业务服务层而非资源层 

TCC没有单独的准备(Prepare)阶段,Try操作兼备资源操作与准备能力 • Try操作可以灵活选择业务资源的锁定粒度(以业务定粒度) 

TCC有较高开发成本

 

 

总结

本文主要是简单介绍了一下柔性事务和柔性事务实现的基础。柔性事务是目前主流的分布式事务解决方案,其基础模式包含四个:幂等操作、可补偿操作、可查询操作和TCC操作。后续文章会分别介绍关于分布式事务的解决方案,敬请期待。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“温室里的花朵”也要直面困难

求关注求转发本文是雄雄的小课堂投稿的第 2 篇文章,作者:小溪“花朵”在爸妈的细心培育下成长。可它们不知道未来是怎样的,它们对未来充满着想象与渴望,却没有人曾告诉它们,这个世界布满荆棘,而“花朵们”也…

Visual Studio 2015和2017里面应该创建哪种 Class Library

微软有些时候是一副不讲道理的大家长作风。一个例子就是它在 Visual Studio 2015/2017 里面配置了一大堆普通人没法理解的 Class Library 模板。 你真的知道应该选哪个吗? 这就是 VS2017 里面你可能熟悉的长列表(而且因为我没有安装 UWP 开发项目&#…

win10操作技巧介绍,很实用!

求关注求转发本文是雄【雄的小课堂】原创的第 136 篇文章1.wind:返回桌面不管你当前所在的什么窗口,一键即可切换到桌面,有时候称之为“老板键”2.wine:打开计算机我最喜欢用了,不管你在任何窗口,一键打开计算机,相比去…

深入理解分布式系统中的缓存架构(上)

转载自 深入理解分布式系统中的缓存架构(上) 本文主要介绍大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景。 1 缓存概述 2 缓存的分类 缓存主要分为以下四类 2.1 CDN缓存 基本介绍 CDN(Content Delivery Network 内容分发网络)的基本原理是广泛…

微软向开发者推出区块链概念验证框架

微软在近期的一篇博文中宣布了一个新的框架,用以在Azure云平台上加速已通过企业概念验证(PoC)的区块链部署。微软希望用户能在可支持分布式账本(DLT)解决方案的基础设施上,借助于灵活的契约和更少的时间&am…

Cookie和Session 登录

Cookie 实现免登陆和Session 01、 需求说明 完成用户登录功能 登录成功后跳到成功页面,显示用户名 登录失败可以跳回登录页面 登录成功后后续操作均能显示当前登录的用户名 02、完成代码 DologinServlet.java Override protected void service(HttpServletRequest req, Http…

《给教师的阅读建议》经典语录

System.out.print("今天开始继续读书摘录"); //不知道官方让不让我在博客里面记录 //如果不让的话我可能得转到别的上面记录 System.out.print("现在开始看《给教师的阅读建议》"); System.out.println("今天是第1天!也是最后一天");…

教你一招快速打开idea的秘诀

大家根据电脑系统的位数,选择 32 位的 VM 配置文件或者 64 位的 VM 配置文件32 位操作系统内存不会超过 4G,所以没有多大空间可以调整,建议不用调整了64 位操作系统中 8G 内存以下的机子或是静态页面开发者是无需修改的。64 位操作系统且内存…

深入理解分布式系统中的缓存架构(下)

转载自 深入理解分布式系统中的缓存架构(下) 承接上一篇《理解分布式系统中的缓存架构(上)》,介绍了大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景,本文主要介绍缓存架构设计常见问题以及解决方案,业界案例。 分…

【jzoj】2018.2.1 NOIP普及组——D组模拟赛

前言 懒… 正题 题1:牛车(jzoj1390) 有m条公路,有n头牛各开一辆车,如果有x辆车开在它前门,它速度就会降低d*x,路上速度至少为l。求有多少头牛可以上路。 输入 第1行: 4个空格隔开的整数N,M,…

JSP的四大作用域和九大内置对象

JSP的四大作用域和九大内置对象 https://wenku.baidu.com/view/a0974190152ded630b1c59eef8c75fbfc77d949d?ivk_sa1023194j&bfetypenew

事件总线知多少(2)

1.引言 之前的一篇文章事件总线知多少(1),介绍了什么是事件总线,并通过发布订阅模式一步一步的分析重构,形成了事件总线的Alpha版本,这篇文章也得到了大家的肯定和积极的反馈和建议,在此谢谢大…

记录程序人生2020.8.11

1.晚休的时间总是短暂的,甚至你都没有来得及闭眼呢就需要将它睁开。上眼皮与下眼皮一直恋恋不舍的分开,天花板渐渐的呈现出来,该起了! 2.5点一刻准时坐在外面的水泥台阶上,飞速打开屏幕中的背单词软件,%……

DDD理论学习系列(4)-- 领域模型

1.引言 我们还是先来拆词理解,领域模型可以拆为“领域”和“模型”二词。 领域:按照我们之前的文章的理解,DDD中的领域是指软件系统要解决的问题,如我们的办公设备公众号在线商城就是为了解决电商问题,对应的就是电商…

Ajax判断用户名是否可用

Ajax的简介 01展示效果并认识Ajax 方案1:传统方案 提交表单,服务器端处理,错误后跳转到注册页面,同时显示错误信息。返回客户端的是整个注册页面。 缺点:较大的网络流量,用户体验不好 方案2:使…

学习分布式不得不会的ACP理论

转载自 学习分布式不得不会的ACP理论 2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想。2年后,麻省理工学院的Seth Gilbert和Nancy Lynch从理论上证明了CAP。之后,CAP理论正式成为分布式计算领域的公认定理。 无…

浅谈我的读书史

点击上方蓝字关注我们本文是【雄雄的小课堂】原创的第 137 篇文章昨日晚间,一个朋友突然问我:“读书真的会有所收获吗?”“读书,真的会改变一个人吗?”刚看到这个问题时,我有点愕然,想着为啥会突…

.NetCore+Jexus代理+Redis模拟秒杀商品活动

开篇叙 ,顺手点个推荐也不错; a. 秒杀流程 b. 封装StackExchange.Redis的使用类 c. Ubuntu16.04上使用Jexus搭建代理完成分布式部署 d. NetCore写实时监控队列服务 秒杀架构设计图︿( ̄︶ ̄)︿三幅 1. 一般业务性架构 2. 后端…

如何快速搭建一个免费的,无限流量的Blog

转载自 如何快速搭建一个免费的,无限流量的Blog 喜欢写Blog的人,会经历三个阶段。 第一阶段,刚接触Blog,觉得很新鲜,试着选择一个免费空间来写。 第二阶段,发现免费空间限制太多,就自己购买域…