RocketMQ事务性消息的设计

概念介绍

Half(Prepare) Message: 指暂时不能传递的消息。当消息成功发送到MQ服务器,但服务器没有收到来自生产者的消息的第二个确认,则该消息被标记为“临时不可交付”。此状态中的消息称为半提交消息(Prepare消息)。服务器

Message Status Check: 在网络断开或生产者应用程序从新启动,可能致使丢失第二个确认事务的消息。当MQ服务器发现一条消息长时间保持为半提交消息转态时,它将向消息生产者发送一个请求,检查消息的最终状态(提交或回滚)。网络

事务性消息执行流程

RocketMQ的事物执行流程以下图所示: 架构

Execute Flow Chart

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

设计细节

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

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

发送事务性消息

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

检查事务性消息

Checking transactional message
上图描述了检查事务消息状态的时序图,当MQ服务器发现消息在很长一段时间内还是半提交的状态,它将发送一个请求消息,来获得当前消息的事务状态。
相关文章
相关标签/搜索