RocketMQ的事务消息是通过 TransactionListener接口来实现的。
在发送事务消息时,首先向RocketMQ Broker 发送一条‘half消息’(半消息),半消息将被存储在broker端的事务消息日志中,但是这个消息还不能被消费者消费。
接下来,在半消息发送成功后,应用程序通过执行本地事务来确定是否要提交该事务消息。
如果本地事务执行成功,就会通知RocketMQ Broker提交该事务消息,使得该消息可以被消费者消费;否则,就会通知RocketMQ Broker 回滚事务消息,该消息将被删除,从而保证消息不会被消费者消费。
拆解下来的话,主要有以下4个步骤:
1.发送半消息:应用程序向RocketMQ Broker 发送一条半消息,该消息在broker 端的事务消息日志中被标记为‘prepared’状态。
2.执行本地事务:RocketMQ会通知应用程序执行本地事务。如果本地事务执行成功,应用程序通知RocketMQ Broker提交该事务消息。
3.提交事务消息:RocketMQ 收到提交消息后,会将该消息的状态从,准备改为(committed),并使该消息可以被消费者消费。
4.回滚事务消息:如果本地事务执行失败,应用程序通知RocketMQ Broker 回滚该事务,RocketMQ将该消息的状态从‘prepared’改为‘rollback’,并将该消息从事务消息日志中删除,从而保证该消息不会被消