微服务--分布式事务的实现方法及替代方案

这两天正在研究微服务架构中分布式事务的处理方案, 做一个小小的总结, 作为备忘. 如有错误, 欢迎指正!

概念澄清
事务补偿机制: 在事务链中的任何一个正向操作, 都必须存在一个完全符合回滚规则的可逆操作, 这个操作通常叫做rollback或者cancel.

CAP理论: CAP(Consistency, Availability, Partition Tolerance), 阐述了一个分布式系统的三个主要方面, 只能同时择其二进行实现. 常见的有CP系统, AP系统.

为什么CA不行呢? 因为没有P的话, 数据一致性会出现问题, 这是任何一个一致性系统不允许出现的情况.

幂等性: 简单的说, 业务操作支持重试, 不会产生不利影响. 常见的实现方式: 为消息额外增加唯一ID.

BASE(Basically avaliable, soft state, eventually consistent): 是分布式事务实现的一种理论标准.

柔性事务 vs. 刚性事务
刚性事务是指强一致性事务, 例如单机环境下遵循ACID的数据库事务, 或者分布式环境中的2PC等.

柔性事务是指遵循BASE理论的事务, 通常用在分布式环境中, 常见的实现方式有: 异步确保型, 最大努力通知型.

最佳实践
先上结论, 再分别介绍分布式事务的各种实现方式.

如果业务场景需要强一致性, 那么尽量避免将它们放在不同服务中, 也就是尽量使用本地事务, 避免使用强一致性的分布式事务(例如2PC).
如果业务场景能够接受最终一致性, 那么最好是使用异步确保型来解决(实际上大部分互联网公司的业务都是这么玩儿的).
注意: 以下每种方案都有不同的适用场合, 需要根据实际业务场景来选择.

两阶段提交(2PC)
两阶段提交(Two Phase Commit, 2PC), 具有强一致性, 是CP系统的一种典型实现, 是数据库层面的强一致性事务实现.

两阶段提交, 常见的标准是XA等. 例如Oracle的数据库支持XA, MySQL从5.5开始支持XA.

下图是两阶段提交的示意图:

图的上半是两阶段提交成功的演示, 下半是两阶段提交失败的演示. 关于两阶段提交网上有很多经典的讲解, 这里就不细说了, 可以参考前面的链接.

优点
依赖数据库服务提供商的XA实现来使用2PC, 无需像TCC那样每个服务都需要手工编写TCC接口实现类.
缺点
事务管理器单点失败
高并发不适用, 资源加锁时间较长, 无法灵活控制锁粒度(db层面的锁在2PC期间会一直被持有, 相较于TCC而言不灵活, 因为无法在tcc的中间阶段解锁.).
TCC (Try-Confirm-Cancle)
TCC是应用层的2PC, 具有最终一致性.

以上图中的A->B实时汇款服务为例. 假设汇款服务和收款服务位于两个不同的微服务中.

首先服务主调方充当事务管理器的角色, 注册汇款收款服务的TCC接口.

事务开始, 进入TCC事务中的TRY阶段.

调用汇款服务的try接口, 检查A账户有效性(不在冻结状态), 余额充足性, 并扣减转账金额.
调用收款服务的try接口, 检查B账户的有效性(不为冻结状态).
检查所有被调服务的try返回值:

如果任一服务try失败, 那么会自动调用所有服务对应的cancel方法, 对于A账户, 就是将余额加回; 对于B账户, 不做任何操作.
如果所有服务的try均成功, 那么会自动调用所有服务对应的confirm方法, 对于A账户, 不做任何操作; 对于B账户, 增加汇款金额
注意: 如果任一cancel或confirm失败, 需要不断重试直到成功或人工介入.

事务结束.

优点
对比与前面提到的2PC, 主要优势是:

可自由控制锁粒度(在应用层控制);
缺点
事务管理器单点失败.

每个服务都要实现TCC接口, 较为复杂.

若允许并发操作, Confirm和Cancel操作无法幂等(可通过额外信息例如唯一事务id实现).

因为数据库级别的事务不允许脏读, 不存在数据一致性问题, 所以数据库级别的rollback设计是幂等的; 而TCC为了避免数据一致性问题, 只能通过补偿型操作实现. 这就导致Confirm和Cancel操作本身不可能幂等, 解决方案有两种:

通过事务id操作去重;
在confirm或cancel阶段, 只有明确收到confirm或cancel的失败反馈才能重试, 否则需要log而后人工介入.
适用场景
严格一致性
执行时间短
实时性要求高
举例: 红包, 收付款, 实时汇款业务.

异步确保型
通过将一系列同步的事务操作变为基于消息执行的异步操作, 避免了分布式事务中的同步阻塞操作的影响.

这个方案真正实现了两个服务的解耦, 解耦的关键就是异步消息和补偿性事务.

这里以一个例子作为讲解:

执行步骤如下:

MQ发送方发送远程事务消息到MQ Server;
MQ Server给予响应, 表明事务消息已成功到达MQ Server.
MQ发送方Commit本地事务.
若本地事务Commit成功, 则通知MQ Server允许对应事务消息被消费; 若本地事务失败, 则通知MQ Server对应事务消息应被丢弃.
若MQ发送方超时未对MQ Server作出本地事务执行状态的反馈, 那么需要MQ Servfer向MQ发送方主动回查事务状态, 以便进一步处理未投递的事务消息(丢弃或投递).
当得知本地事务执行成功时, MQ Server允许MQ订阅方消费本条事务消息.
消费者消费完之后, 需要ack到MQ Server, 之后事务消息才能从MQ Server删除. 否则消费者需要一直重试, 直到成功或者人工介入.
注意事项
消息中间件在系统中扮演一个重要的角色, 所有的事务消息都需要通过它来传达, 所以消息中间件也需要支持HAC来确保事务消息不丢失.
根据业务逻辑的具体实现不同,还可能需要对消息中间件增加消息不重复, 不乱序等其它要求.
适用场景
执行周期较长
实时性要求不高
例如:

非实时汇款业务
退货/退款业务
财务, 账单统计业务(先发送到消息中间件, 而后可进行批量记账)
最大努力通知型
这是分布式事务中要求最低的一种, 也可以通过消息中间件实现, 与前面异步确保型操作不同的一点是, 在消息由MQ Server投递到消费者之后, 允许在达到最大重试次数之后直接结束事务, 无需人工介入确保成功.

优点
高并发, 低耦合
缺点
不支持回滚;
适用场景
交易结果消息的通知等.

SAGA
将一个大事务拆成一串小事务, 分段提交和回滚.

可能的执行序列:

成功: T1, T2, T3, …, Tn;
失败: T1, T2, , T3, …, Tn-1, Cn-1, Cn-2, Cn-3, …, C1
缺点
有数据一致性问题:

举个例子, 定义:

T1=扣100元 T2=给用户加一瓶水 T3=减库存一瓶水
C1=加100元 C2=给用户减一瓶水 C3=给库存加一瓶水
如果在T3失败进行回滚, 此时用户已经把水喝了, 那么就会造成回滚失败, 出现数据一致性问题. 根本原因是没有了tcc的try阶段预留资源导致的. 解决方案就是要么在所有资源上加锁, 要么严格控制t的顺序, 将回滚困难的放在最后.

小结
不管是同步事务中的事务管理器(协调者), 还是异步事务中使用的消息中间件,若要达到一致性保证,都需要使用带有同步复制语义的HAC提供的高可用和高可靠特性,这些都是以性能为代价的,无疑成为了SOA架构中的典型性能瓶颈之一.

不同方案对比


本文链接: http://blog.csdn.net/congyihao/article/details/70195154

参考链接
支付宝运营架构中柔性事务指的是什么?
分布式服务的事务如何处理?
理解分布式事务的两阶段提交2pc
阿里云消息队列MQ-发送事务消息
Github: tcc-transaction
————————————————
版权声明:本文为CSDN博主「congyh」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/congyihao/article/details/70195154

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

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

相关文章

CCNP-第十七篇-VXLAN(三)

CCNP-第十七篇-VXLAN(三) 今天主要有点点复习的效果,这篇内容会偏少一点点 今天主要演示VXLAN环境下的跨子网的vxlan 跨子网的VXLAN 部署方式 1.集中式GW部署,意味着内网里面就一个大网关 本次演示 2.分布式GW部署,这里面会涉及到MPLSBGP,不过很多IDC都用这种. 建立VTEP的过…

CCIE-LAB-第八篇-OSPF前缀压制+MTU+路由汇总

CCIE-LAB-第八篇-OSPF前缀压制+MTU+路由汇总 实际中,思科只会给你5个小时去做下面的全部配置 这个是CCIE-LAB的拓扑图 问题 翻译:1.交换机sw20l和sw202必须在全状态下与接口Vlan3999上的vedge2l和vedge22建立稳定的OSPF邻接。为满足此要求所需的任何配置更改和修正只能在交…

Sharepoint项目周记一:关于开展MOSS项目的前期调查和需要解决的问题

最近负责一个项目,需要结合MOSS TFS Project Server,有的技术以前也没接触过,肯定会遇到很多问题,在此列出项目中的问题和自己的一些感悟。一、对于页面的自定义开发1、可以使用webpart简要步骤: a、将生成的dll放入…

CCIE-LAB-第九篇-BGP下一跳+EBGP防环+伪装AS+通过标签过滤路由

CCIE-LAB-第九篇-BGP下一跳+EBGP防环+伪装AS+通过标签过滤路由 实际中,思科只会给你5个小时去做下面的全部配置 这个是CCIE-LAB的拓扑图 问题 翻译: 2根据这些要求:在HQ rli和SP#I r32之间启动BGP对等。启动DC 2I和SP#I r33之间的BGP对等。在DC r22和SP#24之间启动BGP对等,…

让SharePoint站点输出详细错误信息[转]

转自:http://blog.csdn.net/jackjoy/archive/2007/07/31/1719012.aspx 很显然,这样的错误提示除了会让人抓狂之外对解决问题没有任何帮助,弄过ASP.NET的朋友们都应该想到了修改站点的web.config文件来解决网站相关的问题,对于Sha…

CCIE-LAB-第十篇-BGP-VPNV4+VNPN6+MPLS+关闭TTL

CCIE-LAB-第十篇-BGP-VPNV4+VNPN6+MPLS+关闭TTL 实际中,思科只会给你5个小时去做下面的全部配置 这个是CCIE-LAB的拓扑图 问题 翻译: 根据以下要求在SP#I中配置路由器r3、r4、r5和r6:我在不使用路由反射器的情况下,为相互的VPNV4和VPNV6路由交换配置r3到r6。使用Lo0 IPV4地…

在SharePoint环境中更换密码

下图展示了在一个拥有两个WFE服务器的SharePoint服务器场中更换SharePoint场管理员密码的一个过程. 密码的更改并不要求重启系统. Windows的服务和IIS可以使用密码更换之前的, 由旧密码生成的security token登录并持续运行. 注意, 在更换密码的过程中, 不要重启IIS或整个服务器…

CCIE-LAB-第十一篇-DMVPN+IPSEC+BGP

CCIE-LAB-第十一篇-DMVPN+IPSEC+BGP 实际中,思科只会给你5个小时去做下面的全部配置 这个是CCIE-LAB的拓扑图 问题 翻译: 根据以下要求纠正导致DC、Branch3和Branch4之间的DMVPN连接中断的配置问题:DMVPN必须在Ipsec保护的第3阶段模式2下运行。使用FVRF方法,保护DMVPN操作…

CCIE-LAB-第十二篇-EIGRP+EIGRP末节区域+leak map+分发列表

CCIE-LAB-第十二篇-EIGRP+EIGRP末节区域+leak map+分发列表 实际中,思科只会给你5个小时去做下面的全部配置 这个是CCIE-LAB的拓扑图 问题 翻译:1.确保分支3分支4只能通过EIGRPn DMVPN2接收默认路由。默认路由发起必须在r24上完成,而不使用任何静态路由、重新分配或路由筛选…

CCIE-LAB-第十三篇-DHCP+HSRPV2+Track+DHCP Realy

CCIE-LAB-第十三篇-DHCP+HSRPV2+Track+DHCP Realy 实际中,思科只会给你5个小时去做下面的全部配置 这个是CCIE-LAB的拓扑图 问题 这次的相对来说有点多 翻译: 在DC中的sw2li上,分别根据为分支#3VLANS 2000(10.6.100 0/24)和2001(10.6.101.0/24)创建名为br3 v2000和br3 …

vs2015如何安装vsix扩展工具

下载相应的vsix文件,通过命令的方方式安装,需要使用vsixinstaller命令,这个命令工具在 E:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\VSIXInstaller.exe 根据你安装的vs的一个路径。 cmd命令窗口切换到 这个路径下 …

CCIE-LAB-第十四篇-PIM Sparst+IGMP

CCIE-LAB-第十四篇-PIM Sparst+IGMP 实际中,思科只会给你5个小时去做下面的全部配置 这个是CCIE-LAB的拓扑图 问题 翻译 FABD2正准备在其网络中启用PIM稀疏模式的中东路由。作为验证运行手册的一部分,FABD)2需要进行健全检查,以防止在不同的租用路由器类型上不适当地使用…

【转】SharePoint 2013 开发——开发并部署webpart

webpart我们就不详细阐述了,在APP的开发中,自定义属性设置可以通过APP webpart的URL查询字符串传递,它通过IFRAME来显示远程的内容。废话不多说,我们开始实际操作。 打开Visual Studio,新建SharePoint应用程序项目&am…

CCIE-LAB-第十五篇-IPV6-BGP+VPN6+RT

CCIE-LAB-第十五篇-IPV6-BGP+VPN6+RT 实际中,思科只会给你5个小时去做下面的全部配置 这个是CCIE-LAB的拓扑图 问题 翻译: 根据这些要求,将IPV6连接从总部通过SP扩展到laas站点上的giosk VRF。我在rll assign 2001:2710:311:2/64到r3 assign 2001:2710:311:1/64到gl2的RLI和…

WSPBuilder 生成Webpart 部署包

这里以我做的一个SSO Webpart为例 随便创建一个目录,把WSPBuilder的相关文件拷入,在Feature下创建要部署到Feature下的目录名,如BruceLeeSSOWebpart,那么最后文件就被部署在12\TEMPLATE\FEATURES\BruceLeeSSOWebpart。 把featur…

CCIE-LAB-第十六篇-NAT+OSPF下发默认路由+校验配置(模块一结束篇章)

CCIE-LAB-第十六篇-NAT+OSPF下发默认路由+校验配置(模块一结束篇章) 实际中,思科只会给你5个小时去做下面的全部配置 这个是CCIE-LAB的拓扑图 问题 翻译: 根据这些要求1为FABD2公司网络启用高可用的internet访问。在路由器rl2、r23和r24上,与ISP进行IPV4 BGP对等。确保通过…

没啥好标题才显得有逼格对叭-CSDN

没啥好标题才显得有逼格对叭-CSDN 从中职的不知道啥时候起就开始进来这个网站了 虽然身边的人更倾向于攻城狮,GitHub这些,不过我觉得csdn方便点,也就一直常驻在这里了 最起初的我只是为了存储自己的CCIE-RS的学习笔记,写着写着因为忙着忙那的拖拖拉拉,也没有怎么坚持 一次偶…

解决Sharepoint每天第一次打开速度慢的问题

每天第一次打开Sharepoint的网站会非常慢,下面是解决这个问题的几个方法。 添加crl.microsoft.com到Hosts文件,IP地址指向服务器本机。允许服务器直接连接到crl.microsoft.com。修改服务器注册表。禁止所有用户使用CRL检查,具体修改如下。 注…

问一个网络工程师是怎么崩溃之一的?

问一个网络工程师是怎么崩溃之一的 他喵的我真的快炸了 CCIE-EI-LAB 我做了很久,包括详细命令,这段时间在背答案,就是不看题目只看拓扑图把所有需求背下来做,因为我也要去考IE 电脑都快给我干虚了 不过目前来说我也是把前面的部分已经完全背下来了,我现在把所有的快照删了…

更改Sharepoint管理中心端口号

PowerShell Set-SPCentralAdministration -Port <PortNumber>Stsadm stsadm -o setadminport -port <端口> [-ssl] [-admapcreatenew] [-admapidname] <应用程序池名称>