标签:异步 其他 生成 分布式 理解 mamicode 调用 抖音 角色
阿里4面:聊聊分布式事务的解决方案???公众号关注 “架构师学习营”
设为 “星标”,带你学习更多架构师知识!
大家好,这里是架构师学习营。
本文继续分享分布式事务的另一种常见的解决方案:TCC
分布式事务中的几个角色
TCC是Try、Confirm、Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作:预处理Try、确认Confirm、撤销Cancel。
Try操作做业务检查及资源预留,Confirm做业务确认操作,Cancel实现一个与Try相反的操作即回滚操作。
TM首先发起所有的分支事务的try操作,任何一个分支事务的try操作执行失败,TM将会发起所有分支事务的Cancel操作,若try操作全部成功,TM将会发起所有分支事务的Confirm操作,其中Confirm/Cancel操作若执行失败,TM会进行重试。
try阶段:依次调用参与者的try方法,都返回成功
confirm阶段:依次调用参与者的confirm方法,都返回成功
事务完成。
try阶段:依次调用参与者的try方法,前面2个参与者try方法返回yes,而参与者3返回no
cancel阶段:对已经成功的参与者执行cancel操作,注意了:cancel阶段参与者调用的顺序和try阶段参与者的顺序相反,即先调用参与者2的cancel,然后调用参与者1的cancel。
案例1:跨库转账
举例,场景为 A 转账 100 元给 B,A和B账户在不同的服务。
账户A
try:
try幂等校验
检查余额是否够100元
A账户扣减100元
confirm:
空
cancel:
cancel幂等校验
A账户增加可用余额100元
账户B
try:
空
confirm:
confirm幂等校验
B账户增加100元
cancel:
空
举例,大家玩过抖音,有些朋友抖音上面有收益,可以将收益提现到支付宝,假如提现100到支付宝
抖音(账户表:余额、冻结金额)
try:
try幂等校验
检查余额是否够100元
抖音账户表余额-100,冻结金额+100
confirm:
confirm幂等校验
抖音账户冻结金额-100
cancel:
cancel幂等校验
抖音账户表余额+100,冻结金额-100
账户B
try:
空
confirm:
confirm幂等校验
调用支付宝打款接口,打款100元(对于商户同一笔订单支付宝接口是支持幂等的)
cancel:
空
框架名称 github地址 star数量
tcc-transaction https://github.com/changmingxie/tcc-transaction 4750
hmily https://github.com/Dromara/hmily 2900
ByteTCC https://github.com/liuyangming/ByteTCC 2450
EasyTransaction https://github.com/QNJR-GROUP/EasyTransaction 2100
涉及到的角色
事务发起者(TM)
1、框架应该考虑的地方
开发者应该只用关注分支中3个方法的代码,其他的应该全部交由框架去完成。
2、tcc服务中的事务订单表设计
如果拿TCC事务的处理流程与2PC两阶段提交做比较,2PC通常都是在跨库的DB层面,而TCC则在应用层面的处理,是2PC在应用层面的一种实现,需要通过业务逻辑来实现。这种分布式事务的实现方式的优势在于,可以让应用自己定义数据操作的粒度,使得降低锁冲突、提高吞吐量成为可能。而不足之处则在于对应用的侵入性非常强,业务逻辑的每个分支都需要实现try、confirm、cancel三个操作,代码量比较大。
微服务精品学习线路图,收藏慢慢看!
什么是分布式事务、CAP、BASE 理论?
分布式事务中的2PC是什么?
分布式事务中的3PC是什么?
---------- END ----------
欢迎关注我的公众号“架构师学习营”,如果有收获,麻烦点一下“在看”~
标签:异步 其他 生成 分布式 理解 mamicode 调用 抖音 角色
原文地址:https://blog.51cto.com/14977534/2545960