RocketMQ通过事务消息实现分布式事务。事务消息遵循生产者与Broker的二段提交协议,消息发送后Broker会返回一个未确认的响应,生产者然后再调用Commit或Rollback方法来确认提交或回滚事务。
事务消息的主要流程:
- 生产者发送事务消息,Broker返回MessageQueue未确认响应。
- 生产者本地事务执行成功后,调用commit()方法提交事务。
- 如果第一步发送失败,这一步将触发重试发送事务消息。
- Broker接收到commit()请求后,将事务消息标记为可消费状态。
- 消费者消费并确认事务消息后,Broker删除消息。
- 如果生产者本地事务执行失败,调用rollback()回滚事务。
- Broker接收到rollback()后将丢弃事务消息,不会推送给消费者。
- 如果Broker长时间未收到commit()或rollback(),将启动事务消息回查流程。
- 回查成功并得到响应后,处理方式同3或5。回查不成功视为事务失败,消息丢弃。
事务消息主要涉及的类:
- org.apache.rocketmq.common.message.MessageConst:定义事务消息Flag。
- org.apache.rocketmq.client.producer.TransactionMQProducer:事务消息生产者。
- org.apache.rocketmq.client.impl.MQClientAPIImpl:实现commit()与rollback()方法。
- org.apache.rocketmq.broker.processor.EndTransactionProcessor:Broker处理commit()与rollback()请求。
- org.apache.rocketmq.broker.transaction.TransactionChecker:实现事务消息回查。
RocketMQ通过事务消息与二段提交协议实现分布式事务功能。这也是RocketMQ作为消息中间件的一大高级特性。