RocketMQ系列6——事务消息

本文深入探讨RocketMQ的事务消息实现,包括2PC协议、补偿流程、设计原理及使用限制。详细介绍了半事务消息、消息回查、Commit/Rollback操作,以及事务消息在Java中的应用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        RocketMQ在4.3.0版中支持分布式事务消息,这里RocketMQ的事务消息是采用2PC(两段式协议) +补偿机制(消息回查)的分布式事务功能。提供消息发送与业务落库的一致性。

一、事务流程

流程主要分为两个阶段:正常事务消息的发送及提交、事务消息的补偿流程。

1.事务消息发送及提交:

(1) 生产者发送半事物消息到消息队列服务端。

(2) 消息队列服务端将消息持久化成功之后,返回Ack的确认发送成功的消息。也就是半事物消息发送成功。

(3) 根据发送结果执行本地事务(如果写入失败,此时half消息对业务不可见,本地逻辑不执行)相关逻辑。

(4) 生产者根据本地事务状态结果向消息队列服务端提交二次确认结果,执行Commit(Commit操作服务端把半事物消息标记为可投递,并投递给消费者)或者Rollback(服务端把事物回滚,不会将半事务的消息投递给消费者)。

2.事务消息的补偿流程:

(5)对于没有Commit/Rollback的事务消息,经过国定的时间后,服务端会对消息生产者发起消息回查。

(6) Producer收到回查消息,检查回查消息对应的本地事务的状态。

(7) 根据本地事务状态,重新Commit或者Rollback。

半事务消息:暂时不能投递,生产者已经把消息放到了服务端。但是MQ没有收到生产者的二次确认,标记为"暂不能投递状态",属于半事务消息。

消息回查:网络中断,生产者重启,导致某个事务消息的二次确认丢失,mq查询到某条消息长期处于“暂不能投递状态”,查询生产者这个消息的最终状态(回滚或提交),询问过程叫消息回查。

二、事务消息设计

1.半事物消息对用户不可见原理

        half(半事物)消息,需要备份原消息的主题与消息消费队列,之后改变Topic名字为RMQ_SYS_TRANS_HALF_TOPIC。由于没有消费组订阅这个topic,所以消费端不会消费half类型的消息。RocketMQ中消息的服务端存储结构,Consumer通过ConsumeQueue这个二级索引来读取消息实体内容(commitLog)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值