RocketMQ事务性消息的设计

RocketMQ事务性消息详解
本文深入探讨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服务器发现消息在很长一段时间内仍是半提交的状态,它将发送一个请求消息,来得到当前消息的事务状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值