分布式事务精华总结篇,实打实的干货!
1. 补偿型事务
2.TCC事务模型补充
通用型TCC:标准TCC模型实现,从业务服务需要提供try、confirm、cancel
补偿性TCC:子服务只需要提供 Do 和 Compensate 两个接口
异步确保型 TCC:主服务是可靠消息服务,而子服务则通过消息服务解耦,作为消息服务的消费端,异步地执行。可靠消息服务需要提供 Try、Confirm、Cancel 三个接口。Try 接口只负责持久化记录存储消息数据;Confirm 接口确认发送,这时才开始真正的投递消息;Cancel 接口取消发送,删除消息数据。
补偿性TCC并未提供Try接口,其实已经更接近Saga了,反而应该认为是Saga的变种。
异步确保型 TCC中 子服务不需要提供try、confirm、cancel三个接口,称为TCC貌似也不合适,从本质上其实事务消息的一种可靠投递方式而已。
3. Saga 事务模型补充
业务流程设计时遵循“宁可长款, 不可短款”的原则, 长款意思是客户少了钱机构多了钱, 以机构信誉可以给客户退款, 反之则是短款, 少的钱可能追不回来了。所以在业务流程设计上一定是先扣款。
有些业务场景可以允许让业务最终成功, 在回滚不了的情况下可以继续重试完成后面的流程, 所以要求Saga除了提供“回滚”能力还需要提供“向前”恢复上下文继续执行的能力, 让业务最终执行成功, 达到最终一致性的目的。
从业务流程上说,TCC的Try行为是尝试阶段, Comfirm 和Cannel是确认/回滚。是两阶段的广义实现,在页面表现上可以使用定时回查结果,那么对客户的说就是完美补偿行为。而Saga直接commit,在业务流程上存在的客户感官上的脏读现象。
在数据层面上来说,TCC利用了数据的中间态,Cannel针对中间台数据进行回滚,从而不存在数据污染问题;而Saga使用的是反向操作,存在数据变化记录影响,有数据污染嫌疑。
TCC 适用于执行时间确定且较短、对一致性要求比较高、数据隔离强的业务,比如支付场景。
Saga 适用于业务流程长、业务流程多的业务,在银行业金融机构使用广泛。比如互联网微贷、渠道整合场景
原子性:完全支持。
一致性:只提供最终一致性支持。
隔离性:不完全保证,通常为了系统的吞吐和性能,会一定程度上放弃对隔离性的要求。
持久性:完全支持。