天天看点

分布式一致性总结

背景

CAP定理:分布式系统不能同时满足 一致性(consistency)、可用性(avaliability)、分区容错性(partition tolerance)。亚马逊首席架构提出 BASE原理:基本可用(basic-availibility)、软状态(soft state)、最终一致性(eventually consistency)。

最终一致性解决方案

方案一:两阶段提交

比如XA协议-----一种2pc协议,目前mysql、sqlserver、oracle都支持 XA 协议。另外,开放标准组织(Open Group)也定义了DTSC分布事务处理模型;J2EE定了TX协议和XA协议,TX协议定义了应用管理器与事务管理器的关系,而XA协议定义了事务管理器与资源管理器的关系。

方案二:异步消息事务

所谓异步消息事务,是指满足如下条件的消息:

  1. 发送消息的动作在本地事务中
  2. 本地事务如果执行成功,那么消息消费一定成功

    实现方式除了自己实现满足以上条件的消息,还可以使用开源的消息事务中间件,比如:RMQ就支持如上事务消息

    rmq事务消息的原理:假设A给B转100元

说明:
  1. 步骤4 是A提供给RMQ的回调接口,检查A的本地事务是否成功
  2. 步骤2 失败会调用RMQ的cancel接口
  3. 步骤3 失败RMQ也可以通过回调接口检查步骤2 的状态(RMQ会检查半天没有提交的事务),成功的话会ready,失败的话会cancel
  4. 步骤4 失败 RMQ会轮询处于prepare状态的消息,调用这些消息对应的回调(步骤4)
  5. 步骤5 失败 消息会被放入死信队列由人工处理

方案三:补偿交易(Conpensation Transaction)

采用 Sagas 模式:拆分复杂事务为若干顺序执行的小事务,每执行完成一步都注册一个对应的补偿(回滚)操作。某一个子事务执行失败的后逆序执行所有的补偿事务

方案四:消息重试

解决消费者与 MQ 的一致性问题,采用pull或者push的方式

方案五:幂等

TCC编程模型(try -> commit -> cancel)

方案六:酸碱平衡论

合理采用酸ACID(事务的4个特性),碱(BASE定理)的手段来达到最终一致性的效果,比如:

  1. 酸:强大硬件支持本地事务,如oracle;对mysql事务分片,相关联的数据放在同一个数据库中,分布式事务可一用本地事务实现
  2. 碱:采用最终一致性方案

继续阅读