微服务架构下的分布式事务基础入门( 三 )


  • BA:Basic Available 基本可用
  • “一定时间”可以适当延长
  • 当举行大促时,响应时间可以适当延长
  • 给部分用户返回一个降级页面
  • 给部分用户直接返回一个降级页面,从而缓解服务器压力 。但要注意,返回降级页面仍然是返回明确结果 。
  • 整个系统在某些不可抗力的情况下,仍然能够保证“可用性”,即一定时间内仍然能够返回一个明确的结果 。只不过“基本可用”和“高可用”的区别是:
  • S:Soft State:柔性状态
  • 同一数据的不同副本的状态,可以不需要实时一致 。
  • E:Eventual Consisstency:最终一致性
  • 同一数据的不同副本的状态,可以不需要实时一致,但一定要保证经过一定时间后仍然是一致的 。
7. 酸碱平衡ACID能够保证事务的强一致性,即数据是实时一致的 。这在本地事务中是没有问题的,在分布式事务中,强一致性会极大影响分布式系统的性能,因此分布式系统中遵循BASE理论即可 。但分布式系统的不同业务场景对一致性的要求也不同 。如交易场景下,就要求强一致性,此时就需要遵循ACID理论,而在注册成功后发送短信验证码等场景下,并不需要实时一致,因此遵循BASE理论即可 。因此要根据具体业务场景,在ACID和BASE之间寻求平衡 。
8. 分布式事务协议下面介绍几种实现分布式事务的协议 。
8.1 两阶段提交协议 2PC
分布式系统的一个难点是如何保证架构下多个节点在进行事务性操作的时候保持一致性 。为实现这个目的,二阶段提交算法的成立基于以下假设:
  • 该分布式系统中,存在一个节点作为协调者(Coordinator),其他节点作为参与者(Cohorts) 。且节点之间可以进行网络通信 。
  • 所有节点都采用预写式日志,且日志被写入后即被保持在可靠的存储设备上,即使节点损坏不会导致日志数据的消失 。
  • 所有节点不会永久性损坏,即使损坏后仍然可以恢复 。
1. 第一阶段(投票阶段):
  1. 协调者节点向所有参与者节点询问是否可以执行提交操作(vote),并开始等待各参与者节点的响应 。
  2. 参与者节点执行询问发起为止的所有事务操作,并将Undo信息和Redo信息写入日志 。(注意:若成功这里其实每个参与者已经执行了事务操作)
  3. 各参与者节点响应协调者节点发起的询问 。如果参与者节点的事务操作实际执行成功,则它返回一个"同意"消息;如果参与者节点的事务操作实际执行失败,则它返回一个"中止"消息 。
2. 第二阶段(提交执行阶段):
当协调者节点从所有参与者节点获得的相应消息都为"同意"时:
  1. 协调者节点向所有参与者节点发出"正式提交(commit)"的请求 。
  2. 参与者节点正式完成操作,并释放在整个事务期间内占用的资源 。
  3. 参与者节点向协调者节点发送"完成"消息 。
  4. 协调者节点受到所有参与者节点反馈的"完成"消息后,完成事务 。
如果任一参与者节点在第一阶段返回的响应消息为"中止",或者 协调者节点在第一阶段的询问超时之前无法获取所有参与者节点的响应消息时:
  1. 协调者节点向所有参与者节点发出"回滚操作(rollback)"的请求 。
  2. 参与者节点利用之前写入的Undo信息执行回滚,并释放在整个事务期间内占用的资源 。
  3. 参与者节点向协调者节点发送"回滚完成"消息 。
  4. 协调者节点受到所有参与者节点反馈的"回滚完成"消息后,取消事务 。
不管最后结果如何,第二阶段都会结束当前事务 。
二阶段提交看起来确实能够提供原子性的操作,但是不幸的事,二阶段提交还是有几个缺点的:
  1. 执行过程中,所有参与节点都是事务阻塞型的 。当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态 。
  2. 参与者发生故障 。协调者需要给每个参与者额外指定超时机制,超时后整个事务失败 。(没有多少容错机制)
  3. 协调者发生故障 。参与者会一直阻塞下去 。需要额外的备机进行容错 。(这个可以依赖后面要讲的Paxos协议实现HA)
  4. 二阶段无法解决的问题:协调者再发出commit消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了 。那么即使协调者通过选举协议产生了新的协调者,这条事务的状态也是不确定的,没人知道事务是否被已经提交 。


    推荐阅读