微服务下分布式事务可靠性保证
微服务下分布式事务可靠性保证
分布式事务总的来说分为强一致性方案和最终一致性方案。本质的基础理论是 微服务的CAP理论和BASE(数据的最终一致性)理论。
强一致性方案的理论代表
本质思想是 准备阶段持有多个服务的本地事务资源不提交,不释放,当最终执行完后统一提交所有事务。特点是事务持有时间长,性能较低,强一致性基本得到保证。
• 二阶段提交协议(XA协议)
准备、提交二个阶段。
• 三阶段提交协议
预备、准备、提交三个阶段。在二阶段的基础,在准备阶段先检查各服务状态,也称为预备阶段。
最终一致性方案的理论代表
• TCC模式
TCC的本质原理是把数据库的二阶段提交上升到微服务来实现,从而避免了数据库2阶段中锁冲突的长事务低性能风险。
TCC异步高性能,它采用了try先检查,然后异步实现confirm,真正提交的是在confirm方法中。
分为3个操作,Try,Confiem、Cancel。也就是实现此模式需要实现3个方法。
但是,是两个阶段。第一个阶段是 Try操作,若全部执行成功则执行Confirm操作,否则执行 Cancel操作。
需要处理保证幂等、资源悬挂、空回滚。
幂等 问题:TC重复调用二阶段 解决:事务状态控制记录作为控制手段,只有存在INIT记录时才执行,存在CONFIRMED/ROLLBACKED记录时不再执行
空回滚 问题:TC回滚事务调用二阶段,但一阶段尚未执行 解决:事务状态控制记录作为控制手段,无记录时即为空回滚
资源悬挂 问题:TC回滚事务调用二阶段完成空回滚后,一阶段执行成功 解决:事务状态控制记录作为控制手段,二阶段发现无记录时插入记录,一阶段执行时检查记录是否存在
共通点 核心的解决方案就是事务状态控制表 幂等控制作为最基础的异常处理手段;资源悬挂的前置条件是空回滚,所以发生空回滚时会插入一条状态为ROLLBACKED的控制记录
• 补偿模式
业务重试,反向补偿、人工补偿。代表实现:Seata等,先执行的事务会提交,并记录回滚镜像,当后续执行发生异常则基于镜像回滚,若无异常,则异步删除镜像,若回滚失败,则会重试,达到重试次数后,则需要人工介入。
• 可靠事件模式
可靠性消息 + 人工介入。代表:RocketMq的可靠性事务消息。消息必然消费,若消费失败,则需要人工介入。
注意:二阶段提交并不是指二阶段提交协议,因为在实现上,TCC也是二阶段的