2PC理论
应用场景
操作阶段
- 准备阶段: 协调者向所有参与者发起执行一个事务的询问。
- 提交阶段或者回滚阶段:如果索引参与者都回答YES,那么将执行commit提交任务。如果有任意一个没有返回YES那么将发起callback回滚命令。
2PC缺陷
最终一致性
rabbitMQ(业务方自己实现)
思路
- 业务方准备一个消息表,将操作的事务在本地做强一致性.然后再准备一个定时任务,定时的去扫描消息表,将其推送给RabbitMQ
遇到的问题
推送失败重试推送,一般3次.再失败将报警,进行人工介入.
rocketMQ(MQ支持)
思路
- 依赖rocketMQ把消息发送两个阶段,一个是prepare阶段与一个是comfirm阶段.第一步系统A调用prepare方法,将消息暂存起来.第二步去操作业务表成功后,第三步将调用comfirm方法.确认将消息发送出去.
遇到的问题
- 如果第一成功二三失败,如果第一二成功第三失败情况怎么办?
利用mq功能,将会默认1min扫描一个预发送没有确认的消费,回调给发送方.由发送方决定是否放弃.
TCC
思路
遇到的问题
- 如果在第二阶段调用方发生服务宕机或者某个服务超时?
不断重试.这样要求comfire与cancel都支持幂等操作.
事务状态表 + 调用者重试 + 接收者幂等
思路
- 准备一张事务状态表.来标志事务操作阶段.再启动一个任务,定期的来执行为达到最终状态的事务,重新发送.接收方做幂等操作.
遇到的问题
事务状态表加上ERROR标志,来人工介入
对账
思路
遇到的问题
需要找出其中的规律
弱一致性 + 基于状态补偿
重试 + 回滚 + 报警 + 人工修复
参考