RocketMq事务消息概念

Scroll Down

前言:在秒杀系统的交易模块中提到了,想要实现Redis和Mysql信息的一致性问题,可以引入我们的消息队列,与此同此,经过了解,RocketMq的事务消息可以满足我们的要求。

RocketMq的事务消息是将消息的发送分成了两个阶段:Prepare阶段,和确认阶段。

RocketMq二阶段提交的大致步骤

(一)发送Prepared消息,此时这个Prepared消息,消费端是不可见的,也就表示这条消息是没办法被消费的。

(二)生产者对Prepared消息确认,表示可以被消费者消费

(三)消费者进行消费,消费完ACK确认。

此时会存在一个问题:假设阶段二,生产者对Prepared消息确认发送失败了怎么办?这时,会造成的问题是,消费者永远消费不了这条消息,RocketMq提供了一种解决方案,那就是消息回查机制,如果事务消息一直处于第二阶段(消息未被确认),broker会隔一定的时间去查看这条事务消息的处理状态,一旦发现事务消息状态改变,则消息更改成可见。

RocketMQ事务消息的三种状态:
三种事务状态在LocalTransactionState 这个枚举类里面。

ROLLBACK_MESSAGE:回滚事务,当我们本地的事务发生异常时,回滚本地的事务,并且通知RocketMq,当Broker收到这条消息后,消息的状态就会变为回滚,消费者端就不会收到了,就不会消费这条消息。
COMMIT_MESSAGE: 提交事务,当我们本地的事务完整运行后,就会通知broker,你可以修改消息状态啦,让消费者消费。
UNKNOW: broker会定时的回查Producer消息状态,直到彻底成功或失败。