分布式服务架构学习——分布式一致性协议

分布式一致性协议

国际开放标准组织定义DTS(分布式事务处理模型),模型中包括四种角色:应用程序,事务管理器,资源管理器,通信资源管理器。

J2EE规范中定义了TX协议和XA协议。在J2EE中,关系型数据库,JMS服务即为资源管理器,EJB容器则为事务管理器。

两阶段提交协议

两阶段提交协议把分布式事务分为两个阶段:准备阶段,提交阶段。都是由事务管理器发起的。

  • 准备阶段:事务管理器向事务参与者发送准备指令,参与者对这次事务进行评估,如果可以执行则会写redo,undo日志,锁定资源,执行操作但是没有提交,并通知事务管理器准备成功。
  • 提交阶段:事务管理器收到了该事务所有参与者的确认准备成功之后,则向所有参与者发送提交指令。参与者收到指令之后执行提交操作,释放资源,如果操作失败了,事务管理器则向所有参与者发送中止指令,参与者则取消事务,执行undo日志,释放资源。

存在的问题

  • 锁定资源:重量级操作,效率低,成本高。
  • 阻塞:任何一条指令都要受到明确的响应才会继续执行接下来的操作。
  • 单点故障:如果事务管理器出现故障,则参与者缺少协调者将会一直阻塞。
  • 脑裂:事务管理器发送多条指令,有的参与者收到了,有的没收到,就会出现多个参与者不一致的情况。

三阶段提交协议

两阶段提交的改进版本。其分为三个阶段:

  • 询问阶段:事务管理器询问是否可以完成指令,参与者只需要回答是或者不是。这个阶段超时会中止事务。
  • 准备阶段:如果在询问阶段参与者都返回了确认,则发送执行的请求,和两阶段提交协议中的准备阶段类似,参与者写日志,锁定资源,执行操作。
  • 提交阶段:如果准备阶段参与者都返回了确认,则发送提交请求,和两阶段提交协议中的提交阶段类似,参与者执行提交操作,释放资源,如果操作失败了,事务管理器则向所有参与者发送中止指令,参与者则取消事务,执行undo日志,释放资源。

和两阶段提交协议的不同点

  • 增加了询问阶段,通过这个阶段可以尽可能早的发现参与者无法执行的情况。
  • 准备阶段和提交阶段增加了超时,一旦超时,则事务管理器和参与者都会继续提交事务,默认成功。这样可以避免不会处于永远阻塞状态,永远锁定资源。

TCC

两阶段和三阶段提交协议实现复杂,性能不高,很少使用。

  • try-尝试执行业务

完成所有业务检查,预留必须业务资源

  • confirm-确认执行业务

真正执行业务,不作任何业务检查,只使用Try阶段预留的业务资源,Confirm操作必须保证幂等性 。

  • cancel-取消执行业务

如果执行的过程中出现问题则执行逆操作cancel来保证最终一致性,释放Try阶段预留的业务资源,Cancel操作必须保证幂等性。

参考资料

[1] 李艳鹏 杨彪. 分布式服务架构 [M].电子工业出版社,2017.8

https://www.cnblogs.com/smileIce/p/11221610.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值