分布式事务-最终一致性

基于事务消息实现最终一致性。

  • 通过MQ事务消息能力。
  • 假设两个本地事务,对应服务A和服务B。

服务A:

    1. 发送一条事务消息,状态为“初始状态”。
    1. 执行本地事务 。成功,更新之前的事务消息状态为“正常”;失败,删除之前的事务消息。

消息服务端:

    1. 定时扫描所有‘事务消息’,对超时的事务消息进行处理。
    1. 向具有“生产者ID”的服务端发送请求,检查之前的本地事务是否执行成功。如果未执行或执行失败,删除当前的事务消息;如果执行成功,则更新本事务消息状态为“正常”。

服务B:

    1. 订阅了前面的“事务消息”。
    1. 获取“正常”状态的事务消息,通过消息中的事务业务信息,执行本地事务。成功,删除消息;失败,重试;超过重试次数,则或者转人红工处理,或者发送回滚消息,进行回滚(服务A获取回滚消息,回滚之前执行的本地事务)。

总结:通过消息进行事务异步执行,最终保证两个事务同时成功或失败,保持了事务的最终一致性。消息服务扮演了事务日志的职能,对全局事务有一个统一的记录和调度功能(消息服务端/消息中心),事务的参与者通过对消息的订阅关系建立了事务间的关联。
当发生异常时,通常不是回滚策略,而是采用正向补偿的方式,不断重试或人工干预,使之继续超前执行。

可靠消息传递

    1. 消息至少投递一次,但(异常情况)可能会投递多次。因此要求消息处理程序必须实现幂等(同一操作反复执行多次结果不变)!
    1. 网络通信危险期,in doubt time
      请求发出之后、服务器返回应答之前!(各种可能状况:服务器未收到请求、服务器收到请求但发生异常[如down机]、服务器收到请求正常完成处理但返回响应未正常发出、响应发出客户端未收到)

你可能感兴趣的:(分布式事务-最终一致性)