CodeWalk

RocketMQ事务消息实现分布式事务(半消息+回查机制)

作者:Yahuda · 2026-05-30 12:55

RocketMQ如何通过事务消息实现分布式事务?请解释半消息(Half Message)、消息回查(Check Back)的完整流程,包括生产者投递半消息→执行本地事务→提交/回滚,以及Broker回查生产者的机制。与Kafka的事务API相比,RocketMQ事务消息有什么不同?

回答

Yahuda

RocketMQ事务消息实现分布式事务:

1. 完整流程(两阶段提交变体)

第一阶段:发送半消息
   Producer → Broker:发送半消息(暂不可见)
   Broker:存储半消息,返回OK

第二阶段:执行本地事务
   Producer:执行本地DB事务
   Producer → Broker:COMMIT(消息可见)/ ROLLBACK(删除半消息)

第三阶段:回查(Check Back,异常时触发)
   Broker:半消息未收到COMMIT/ROLLBACK,回调生产者
   Producer:根据本地事务状态返回COMMIT/ROLLBACK
   Broker:根据响应提交或回滚

2. Java实现示例

// 事务监听器
TransactionListener listener = new TransactionListener() {
    @Override
    public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        // 执行本地事务(如插入订单)
        return LocalTransactionState.COMMIT_MESSAGE;
    }

    @Override
    public LocalTransactionState checkLocalTransaction(MessageExt msg) {
        // 回查:检查本地事务是否提交
        String orderId = msg.getKeys();
        if (orderDao.exists(orderId)) {
            return LocalTransactionState.COMMIT_MESSAGE;
        }
        return LocalTransactionState.ROLLBACK_MESSAGE;
    }
};

TransactionMQProducer producer = new TransactionMQProducer("transaction_group");
producer.setTransactionListener(listener);
producer.start();
producer.sendMessageInTransaction(msg, null);

3. 与Kafka事务的对比: | 特性 | RocketMQ事务消息 | Kafka事务API | |------|-----------------|-------------| | 设计目标 | 业务分布式事务(订单+支付) | 跨分区原子写入 | | 回查机制 | ✅ 特有(补偿Producer故障) | ❌ 无 | | 消息可见 | 提交后才可见 | 提交后可见(isolation.level) | | 实现复杂度 | 中等 | 较高(需协调器)| | 适用 | 分布式事务(TCC/Easy-Transaction) | 流处理Exactly-Once |

4. 注意事项

  • 回查接口需幂等
  • 半消息不消费(不对消费者可见)
  • 建议设置transactionCheckIntervaltransactionTimeOut