RocketMQ事务消息实现分布式事务(半消息+回查机制)
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. 注意事项:
- 回查接口需幂等
- 半消息不消费(不对消费者可见)
- 建议设置
transactionCheckInterval和transactionTimeOut