RocketMQ的事务消息和非事务消息有什么区别?

RocketMQ的事务消息和非事务消息有以下几个主要区别:

  1. 产生方式不同:
    • 非事务消息:通过普通的send方法发送。
    • 事务消息:通过事务方式的sendMessageInTransaction方法发送。
  2. 消息存储不同:
    • 非事务消息:消息被直接存储在Topic对应的CommitLog和ConsumeQueue中。
    • 事务消息:消息首先存储在临时Topic的CommitLog中,然后根据执行本地事务和消息回查的结果来判断是否提交到最终Topic。
  3. 消息消费不同:
    • 非事务消息:消费者直接从Topic消费消息。
    • 事务消息:只有消息提交到最终Topic后,消费者才能消费到这条消息。
  4. 监听回调不同:
    • 非事务消息:不需要监听回调。
    • 事务消息:开发者需要实现TransactionListener接口来监听事务状态的回调。
  5. 拉取方式不同:
    • 非事务消息:通过普通pull接口拉取。
    • 事务消息:通过TransactionContext接口执行本地事务来拉取。

事务消息主要依靠两阶段提交协议来保证消息事务性:

  1. 生产者发送事务消息后,如果本地事务执行成功,会通过 executeLocalTransactionBranchCommit 方法提交消息。
  2. 如果本地事务执行失败,会通过 executeLocalTransactionBranchRollback 方法回滚消息。
  3. Broker根据生产者提交或回滚消息的请求来判断该消息是否最终投递至Topic。