XA协议
二阶段提交协议
第一阶段:投票
-
协调者向所有的参与者发送事务执行请求,并等待参与者反馈事务执行结果; -
事务参与者收到请求之后,执行事务但不提交,并记录事务日志; -
参与者将自己事务执行情况反馈给协调者,同时阻塞等待协调者的后续指令。
第二阶段:事务提交
-
所有的参与者都回复能够正常执行事务。 -
一个或多个参与者回复事务执行失败。 -
协调者等待超时。
-
协调者向各个参与者发送 commit 通知,请求提交事务; -
参与者收到事务提交通知之后执行 commit 操作,然后释放占有的资源; -
参与者向协调者返回事务 commit 结果信息。
除此之外, 还有2种情况, 囿于篇幅, 详情参考: 亿级流量架构之分布式事务思路及方法后面的二阶段提交协议
今天要聊的TCC就是二阶段提交的具体事务实现。
LCN
详情参考:官网(中文版)(https://www.codingapi.com/)
有了前面的XA协议以及二阶段提交的知识, 就不难理解LCN框架了, 这个框架可以理解成就是上面所说的协调者, 不生产事务, 只负责协调事务。5.0以后框架兼容了LCN、TCC、TXC三种事务模式。
LCN中各个字母依次代表:锁定事务单元(lock)、确认事务模块状态(confirm)、通知事务(notify)。
在一个分布式系统下存在多个模块协调来完成一次业务。那么就存在一次业务事务下可能横跨多种数据源节点的可能。TX-LCN目的是解决这样的问题。
例如存在服务模块A 、B、 C。A模块是mysql作为数据源的服务,B模块是基于redis作为数据源的服务,C模块是基于mongo作为数据源的服务。若需要解决他们的事务一致性就需要针对不同的节点采用不同的方案,并且统一协调完成分布式事务的处理。
在LCN中, 协调者称之为TxManager , 参与者称之为 TxClient, TxManager作为分布式事务的控制方, 事务发起方或者参与方都由TxClient端来控制决定。
时序图(来源官网):
LCN核心步骤
-
创建事务组
是指在事务发起方开始执行业务代码之前先调用TxManager创建事务组对象,然后拿到事务标示GroupId的过程。 -
加入事务组
添加事务组是指参与方在执行完业务方法以后,将该模块的事务信息通知给TxManager的操作。 -
通知事务组
是指在发起方执行完业务代码以后,将发起方执行结果状态通知给TxManager,TxManager将根据事务最终状态和事务组的信息来通知相应的参与模块提交或回滚事务,并返回结果给事务发起方。
TCC
整体流程如图
主要含义 | 尝试执行业务 | 确认执行业务 | 取消执行业务 |
执行操作 | 完成所有业务检查( 一致性 ) | 不做任务业务检查 | 释放 Try 阶段预留的业务资源 |
预留必须业务资源( 准隔离性 ) | Confirm 操作满足幂等性 | Cancel 操作满足幂等性 | |
真正执行业务 |
TCC补偿机制
-
我没有订到返程机票,那么我就去不了了。我需要把订到的去程机票,酒店、租到的车都给取消了,并且把请的假也取消了。 -
如果我假也请好了,机票,酒店也订好了,只是车没租到,那么并不影响我出行这个事,整个事还是可以继续的。 -
如果我的飞机因为天气原因取消或是晚点了,那么我被迫要去调整和修改我的酒店预订和租车的预订。
业务补偿机制特点
-
要能清楚地描述出要达到什么样的状态(比如:请假、机票、酒店这三个都必须成功,租车是可选的),以及如果其中的条件不满足,那么,我们要回退到哪一个状态。这就是所谓的整个业务的起始状态定义。 -
当整条业务跑起来的时候,我们可以串行或并行地做这些事。对于旅游订票是可以并行的,但是对于网购流程(下单、支付、送货)是不能并行的。总之,我们的系统需要努力地通过一系列的操作达到一个我们想要的状态。如果达不到,就需要通过补偿机制回滚到之前的状态。这就是所谓的状态拟合。 -
对于已经完成的事务进行整体修改,可以考虑成一个修改事务。
业务补偿的设计重点
-
努力地把一个业务流程执行完成。 -
如果执行不下去,需要启动补偿机制,回滚业务流程。
-
因为要把一个业务流程执行完成,需要这个流程中所涉及的服务方支持幂等性。并且在上游有重试机制。 -
我们需要小心维护和监控整个过程的状态,所以,千万不要把这些状态放到不同的组件中,最好是一个业务流程的控制方来做这个事,也就是一个工作流引擎。所以,这个工作流引擎是需要高可用和稳定的。这就好像旅行代理机构一样,我们把需求告诉它,它会帮我们搞定所有的事。如果有问题,也会帮我们回滚和补偿的。 -
补偿的业务逻辑和流程不一定非得是严格反向操作。有时候可以并行,有时候,可能会更简单。总之,设计业务正向流程的时候,也需要设计业务的反向补偿流程。 -
我们要清楚地知道,业务补偿的业务逻辑是强业务相关的,很难做成通用的。 -
下层的业务方最好提供短期的资源预留机制。就像电商中的把货品的库存预先占住等待用户在 15 分钟内支付。如果没有收到用户的支付,则释放库存。然后回滚到之前的下单操作,等待用户重新下单。
站在巨人的肩膀上
-
陈皓 左耳听风专栏(https://time.geekbang.org/column/intro/48)
如喜欢本文,请点击右上角,把文章分享到朋友圈
·END·
作者:等不到的口琴
来源:www.cnblogs.com/Courage129/p/14528981.html
版权申明:内容来源网络,仅供分享学习,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!
关注公众号,回复关键词:架构师
获取2T架构师学习资料
本篇文章来源于微信公众号:程序IT圈
原创文章,作者:software,如若转载,请注明出处:https://www.sldh123.com/3300.html