分布式事物在RocketMQ中的应用

RocketMQ 4.3 版本之后提供了对分布式事务消息的支持,它采用了一种类似于两阶段提交(2PC)的机制,但又有所不同,可以实现最终一致性的分布式事务。RocketMQ 的事务消息主要用于解决生产者发送消息和本地事务的原子性问题。

应用场景:

典型的场景是电商中的下单流程:

  1. 用户下单,订单服务需要创建订单。
  2. 同时,需要发送一个消息到库存服务,通知其扣减库存。

如果订单创建成功,但消息发送失败,或者消息发送成功,但订单创建失败,都会导致数据不一致。RocketMQ 的事务消息可以解决这个问题。

RocketMQ 事务消息原理:

  1. 发送半消息(Half Message):

    • 生产者首先发送一个半消息(Half Message)到 RocketMQ Broker。
    • 半消息对消费者不可见,它会被存储在一个特殊的内部 topic(RMQ_SYS_TRANS_HALF_TOPIC)中。
    • Broker 会响应生产者,确认半消息已接收。
  2. 执行本地事务:

    • 生产者在收到 Broker 对半消息的确认后,执行本地事务(例如,创建订单)。
    • 本地事务的执行结果可能是提交、回滚或未知。
  3. 提交/回滚半消息:

    • 根据本地事务的执行结果,生产者向 Broker 发送提交(Commit)或回滚(Rollback)请求。
      • 提交: Broker 将半消息标记为可投递,并将其从 RMQ_SYS_TRANS_HALF_TOPIC 转移到真正的目标 topic。消费者现在可以看到并消费这条消息。
      • 回滚: Broker 删除半消息。
      • 未知: 生产者不发送任何请求,Broker 会定期回查生产者(见下文)。
  4. 事务回查 (Transaction Check):

    • 如果 Broker 长时间没有收到生产者对半消息的提交或回滚请求(可能是生产者宕机、网络问题等原因),Broker 会主动向生产者发送事务回查请求。
    • 生产者收到回查请求后,需要检查本地事务的状态(通常通过查询数据库),并再次向 Broker 发送提交或回滚请求。
    • RocketMQ默认回查15次, 可以通过transactionCheckMax参数配置.
  5. 消费者消费消息:

    • 消费者从目标 topic 消费消息,执行相应的业务逻辑(例如,扣减库存)。
    • 消费者的消费逻辑需要保证幂等性,因为在某些情况下(例如,消费者处理消息时宕机),消息可能会被重复消费。

关键概念:

  • 半消息 (Half Message): 一种特殊的消息,对消费者不可见,用于在生产者和 Broker 之间进行事务协调。
  • 事务回查 (Transaction Check): Broker 主动向生产者查询半消息状态的机制,用于处理生产者宕机或网络问题导致的消息状态不一致。
  • 事务消息生产者 (TransactionMQProducer): RocketMQ 提供的特殊生产者,用于发送事务消息。需要配置 TransactionListener
  • TransactionListener: 生产者端的监听器接口, 包含两个方法:
    • executeLocalTransaction: 执行本地事务,并返回本地事务的状态(LocalTransactionState.COMMIT_MESSAGELocalTransactionState.ROLLBACK_MESSAGELocalTransactionState.UNKNOW)。
    • checkLocalTransaction: 用于事务回查,检查本地事务的状态,并返回本地事务的状态。

代码示例 (Java):

import org.apache.rocketmq.client.producer.*;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.remoting.common.RemotingHelper;

import 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值