分布式一致性协议
国际开放标准组织定义DTS(分布式事务处理模型),模型中包括四种角色:应用程序,事务管理器,资源管理器,通信资源管理器。
J2EE规范中定义了TX协议和XA协议。在J2EE中,关系型数据库,JMS服务即为资源管理器,EJB容器则为事务管理器。
两阶段提交协议
两阶段提交协议把分布式事务分为两个阶段:准备阶段,提交阶段。都是由事务管理器发起的。
- 准备阶段:事务管理器向事务参与者发送准备指令,参与者对这次事务进行评估,如果可以执行则会写redo,undo日志,锁定资源,执行操作但是没有提交,并通知事务管理器准备成功。
- 提交阶段:事务管理器收到了该事务所有参与者的确认准备成功之后,则向所有参与者发送提交指令。参与者收到指令之后执行提交操作,释放资源,如果操作失败了,事务管理器则向所有参与者发送中止指令,参与者则取消事务,执行undo日志,释放资源。
存在的问题
- 锁定资源:重量级操作,效率低,成本高。
- 阻塞:任何一条指令都要受到明确的响应才会继续执行接下来的操作。
- 单点故障:如果事务管理器出现故障,则参与者缺少协调者将会一直阻塞。
- 脑裂:事务管理器发送多条指令,有的参与者收到了,有的没收到,就会出现多个参与者不一致的情况。
三阶段提交协议
两阶段提交的改进版本。其分为三个阶段:
- 询问阶段:事务管理器询问是否可以完成指令,参与者只需要回答是或者不是。这个阶段超时会中止事务。
- 准备阶段:如果在询问阶段参与者都返回了确认,则发送执行的请求,和两阶段提交协议中的准备阶段类似,参与者写日志,锁定资源,执行操作。
- 提交阶段:如果准备阶段参与者都返回了确认,则发送提交请求,和两阶段提交协议中的提交阶段类似,参与者执行提交操作,释放资源,如果操作失败了,事务管理器则向所有参与者发送中止指令,参与者则取消事务,执行undo日志,释放资源。
和两阶段提交协议的不同点
- 增加了询问阶段,通过这个阶段可以尽可能早的发现参与者无法执行的情况。
- 准备阶段和提交阶段增加了超时,一旦超时,则事务管理器和参与者都会继续提交事务,默认成功。这样可以避免不会处于永远阻塞状态,永远锁定资源。
TCC
两阶段和三阶段提交协议实现复杂,性能不高,很少使用。
- try-尝试执行业务
完成所有业务检查,预留必须业务资源
- confirm-确认执行业务
真正执行业务,不作任何业务检查,只使用Try阶段预留的业务资源,Confirm操作必须保证幂等性 。
- cancel-取消执行业务
如果执行的过程中出现问题则执行逆操作cancel来保证最终一致性,释放Try阶段预留的业务资源,Cancel操作必须保证幂等性。
参考资料
[1] 李艳鹏 杨彪. 分布式服务架构 [M].电子工业出版社,2017.8