分布式事务(Distributed Transaction)特指多个服务同时访问多个数据源的事务处理机制。分布式环境下ACID与CAP不兼容性,事务从追求强一致性,降低为追求最终一致性。
1. 可靠事件队列
假设分布式事务涉及到三个服务S1,S2,S3,每个服务有自己的数据库,按照S1->S2->S3的业务顺序执行DB操作,如:S1扣款->S2减库存->S3收款
步骤
- 发起方:在S1的DB中新建消息表(事务id+状态+相关数据),扣款 + 写入消息表,操作在S1的本地事务完成
- 消息服务:定时“轮询”消息表,将“进行中”的消息同时发送到S2、S3
- 参与方:收消息进行处理,S2减库存,S3收款,成功则向S1返回结果,全部成功则事务结束
注意点
- 参与事务多个业务的多个操作,出错概率预先评估,最容易出错最先执行
- 只要第一步完成,后续就没有失败回滚的概念只许成功不许失败,反复重试直到成功或者人工介入
- 消息的处理必须具有幂等性,通常消息带有唯一事务id,保证只执行一次
落地实现中,消息服务是灵活部分,可能是单独服务,也可能是嵌入在业务服务内部的定时器;消息队列的选择,也比较灵活kafka、RocketMQ(推荐)都行。