本文我们将学习到一种常见的柔性事务解决方案:消息一致性事务方案。
对于TCC型事务,跨系统的调用均是基于服务间的直接调用,即很大程度上是同步调用。基于TCC方案能够保证主子事务同时成功,同时失败。
但实际开发中,由于多方面的考虑,我们会将服务拆分为异步方式,一般是基于MQ进行服务间的解耦,服务发起方执行完本地业务操作后发送一条消息给到消息中间件(比如:RocketMQ、RabbitMQ、Kafka、ActiveMQ等),被动方服务从MQ中消费该消息并进行业务处理,从而形成业务上的闭环。
这种场景下,我们还是希望异步的多个业务操作同时成功,同时失败,基于TCC的同步型事务解决方案就不可行了,这时就需要祭出可靠消息最终一致性方案。
实现可靠消息服务
首先按照惯例我们先看一下该方案的简略的结构图,如下
核心流程1:上游投递消息
基于上图,我们分析一下如果要实现一个可靠消息一致性的服务,需要实现哪些功能,要走哪些流程。
调用开始,业务主动方(之后称为主动方)预先发送一条消息到消息服务(图中中间的部分)中,消息中包含后续的业务操作所必须的业务参数,消息服务接收到该消息后存储消息到消息存储中,并设置消息状态为 “待确认”。
如果消息存储失败则直接返回消息持久化失败,本次业务操作结束。