简介 #
分布式事务,就是在分布式系统中运行的事务,由多个本地事务组合而成
方案
- 基于 XA 协议的二阶段提交协议方法
- 三阶段提交协议方法
- 基于消息的最终一致性方法
XA二阶段提交 #
二阶段提交: Two-Phase Commit,2PC
XA(Extended Architecture)是一个分布式事务协议
涉及对象
- 事务管理器 // 事务协调者Transaction Coordinator,负责各个本地资源的提交和回滚
- 本地资源管理器 // 分布式事务的参与者Participants,执行实际的操作,如数据库或其他资源
执行过程
- 投票(voting)
- 提交(commit)
举例
第一阶段
sequenceDiagram participant 协调者 participant 订单系统 participant 库存系统 协调者->>订单系统: 询问订单情况 订单系统-->>协调者: 锁定用户A相关订单,增加一条购买100件T恤的订单 订单系统-->>协调者: 回复同意消息"Yes" 协调者->>库存系统: 询问出货情况 库存系统-->>协调者: 回复库存不足信息"No"
第二阶段sequenceDiagram participant 协调者 participant 订单系统 participant 库存系统 协调者->>订单系统: 发送"DoAbort"消息 订单系统-->>协调者: 回复"HaveCommitted"消息 协调者->>库存系统: 发送"DoAbort"消息 库存系统-->>协调者: 回复"HaveCommitted"消息
缺点 #
- 同步阻塞问题
- 单点故障问题
- 数据不一致问题
三阶段提交方法 #
三阶段提交协议(Three-phase commit protocol,3PC),三阶段提交引入了超时机制和准备阶段
- CanCommit
- PreCommit // 因为超时或条件不充分进行快速失败
- DoCommit
消息最终一致性 #
将需要分布式处理的事务通过消息或者日志的方式异步执行,消息或日志可以存到本地文件、数据库或消息队列中,再通过业务规则进行失败重试
是BASE理论体现,牺牲了强一致性采取最终一致性.
基于 MQ 的消息投递 #
实现生产端和消费端的双向确认
- MQ 自动应答机制导致的消息丢失
- 采取编程的方式手动发送应答
- 高并发场景下的消息积压导致消息丢失
- 未完成的消息重新投递来进行消息补偿