RocketMQ的事务消息和非事务消息有以下几个主要区别:
- 产生方式不同:
- 非事务消息:通过普通的send方法发送。
- 事务消息:通过事务方式的sendMessageInTransaction方法发送。
- 消息存储不同:
- 非事务消息:消息被直接存储在Topic对应的CommitLog和ConsumeQueue中。
- 事务消息:消息首先存储在临时Topic的CommitLog中,然后根据执行本地事务和消息回查的结果来判断是否提交到最终Topic。
- 消息消费不同:
- 非事务消息:消费者直接从Topic消费消息。
- 事务消息:只有消息提交到最终Topic后,消费者才能消费到这条消息。
- 监听回调不同:
- 非事务消息:不需要监听回调。
- 事务消息:开发者需要实现TransactionListener接口来监听事务状态的回调。
- 拉取方式不同:
- 非事务消息:通过普通pull接口拉取。
- 事务消息:通过TransactionContext接口执行本地事务来拉取。
事务消息主要依靠两阶段提交协议来保证消息事务性:
- 生产者发送事务消息后,如果本地事务执行成功,会通过 executeLocalTransactionBranchCommit 方法提交消息。
- 如果本地事务执行失败,会通过 executeLocalTransactionBranchRollback 方法回滚消息。
- Broker根据生产者提交或回滚消息的请求来判断该消息是否最终投递至Topic。