基于事务消息实现最终一致性。
- 通过MQ事务消息能力。
- 假设两个本地事务,对应服务A和服务B。
服务A:
- 发送一条事务消息,状态为“初始状态”。
- 执行本地事务 。成功,更新之前的事务消息状态为“正常”;失败,删除之前的事务消息。
消息服务端:
- 定时扫描所有‘事务消息’,对超时的事务消息进行处理。
- 向具有“生产者ID”的服务端发送请求,检查之前的本地事务是否执行成功。如果未执行或执行失败,删除当前的事务消息;如果执行成功,则更新本事务消息状态为“正常”。
服务B:
- 订阅了前面的“事务消息”。
- 获取“正常”状态的事务消息,通过消息中的事务和业务信息,执行本地事务。成功,删除消息;失败,重试;超过重试次数,则或者转人红工处理,或者发送回滚消息,进行回滚(服务A获取回滚消息,回滚之前执行的本地事务)。
总结:通过消息进行事务异步执行,最终保证两个事务同时成功或失败,保持了事务的最终一致性。消息服务扮演了事务日志的职能,对全局事务有一个统一的记录和调度功能(消息服务端/消息中心),事务的参与者通过对消息的订阅关系建立了事务间的关联。
当发生异常时,通常不是回滚策略,而是采用正向补偿的方式,不断重试或人工干预,使之继续超前执行。
可靠消息传递
- 消息至少投递一次,但(异常情况)可能会投递多次。因此要求消息处理程序必须实现幂等(同一操作反复执行多次结果不变)!
- 网络通信危险期,in doubt time
请求发出之后、服务器返回应答之前!(各种可能状况:服务器未收到请求、服务器收到请求但发生异常[如down机]、服务器收到请求正常完成处理但返回响应未正常发出、响应发出客户端未收到)
- 网络通信危险期,in doubt time
网友评论