天天看点

RocketMQ事务性消息的设计

概念介绍

Half(Prepare) Message: 指暂时不能传递的消息。当消息成功发送到MQ服务器,但服务器没有收到来自生产者的消息的第二个确认,则该消息被标记为“临时不可交付”。此状态中的消息称为半提交消息(Prepare消息)。
Message Status Check: 在网络断开或生产者应用程序重新启动,可能导致丢失第二个确认事务的消息。当MQ服务器发现一条消息长时间保持为半提交消息转态时,它将向消息生产者发送一个请求,检查消息的最终状态(提交或回滚)。

事务性消息执行流程

RocketMQ的事物执行流程如下图所示:

  1. 生产者发送Prepare消息到MQ服务器。
  2. 成功发送Prepare消息后,执行本地事务。
  3. 根据本地事务结果向MQ服务器发送提交或回滚消息。
  4. 如果在本地事务执行中生产者将提交/回滚消息丢失,或悬而未决。MQ服务器将检查消息发送到同一组中的每个生产者,以此来获得消息本地事务执行的状态。
  5. 根据本地事务状态生成应答提交/回滚消息。
  6. 提交的消息将会提供给消费者消费,但是回滚的消息将被MQ服务器丢弃。

设计细节

RocketMQ的事务性消息设计架构总览如下图:

如图所示,为了屏蔽存储的底层实现,所有事务消息操作都集中在事务服务接口上。RocketMQ提供了一个它自己实现的默认存储系,我们使用事务桥实现事务性存储逻辑,而不是直接修改RocketMQ的存储层。

发送事务性消息

上图描述了发送事务性消息的时序图。从该图中,我们可以清楚地看到事务性消息是如何在两个阶段提交的.

检查事务性消息

上图描述了检查事务消息状态的时序图,当MQ服务器发现消息在很长一段时间内仍是半提交的状态,它将发送一个请求消息,来得到当前消息的事务状态。