RocketMQ 如何实现分布式事务?

RocketMQ通过事务消息实现分布式事务。事务消息遵循生产者与Broker的二段提交协议,消息发送后Broker会返回一个未确认的响应,生产者然后再调用Commit或Rollback方法来确认提交或回滚事务。

事务消息的主要流程:

  1. 生产者发送事务消息,Broker返回MessageQueue未确认响应。
  2. 生产者本地事务执行成功后,调用commit()方法提交事务。
  • 如果第一步发送失败,这一步将触发重试发送事务消息。
  1. Broker接收到commit()请求后,将事务消息标记为可消费状态。
  2. 消费者消费并确认事务消息后,Broker删除消息。
  3. 如果生产者本地事务执行失败,调用rollback()回滚事务。
  • Broker接收到rollback()后将丢弃事务消息,不会推送给消费者。
  1. 如果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作为消息中间件的一大高级特性。