分布式事务场景下,RocketMQ通过事务消息机制与顺序消息特性的结合,实现最终一致性。
一、事务消息与顺序消息的协同机制
1. 两阶段提交(2PC)与顺序保障
-
阶段一(半消息发送)
生产者发送半消息到
RMQ_SYS_TRANS_HALF_TOPIC
,此时消息对消费者不可见。Broker将消息持久化并记录事务ID。 -
阶段二(事务状态确认)
本地事务执行完成后,生产者通过
TransactionListener
回调通知Broker提交(COMMIT)或回滚(ROLLBACK)。若超时未确认,Broker触发事务回查。
2. 顺序性保障设计
-
队列绑定:同一业务单元(如订单ID)的消息通过
MessageQueueSelector
路由到同一队列。 -
单线程消费:消费者开启
ConsumeMode.ORDERLY
模式,确保队列内消息顺序处理。
二、实现流程(以订单支付为例)
1. 生产者端配置
// 1. 创建事务消息生产者
TransactionMQProducer producer = new TransactionMQProducer("order_group");
producer.setTransactionListener(new OrderTransactionListener());