最近在项目中遇到了一个保证消息不丢失的场景,于是就想到了rocketmq的事务消息
在RocketMQ中有一个非常有用的功能,就是事务消息功能,事务消息机制,可以让我们确保发送的消息一定能写进MQ里,绝不会丢失掉。
1、首先生产者发送half消息到MQ去,试探MQ是否正常
首先会发送一条prepare消息到broker中,这个消息消费者是不知道的,因为此时这个消息的topic已经被修改了。
如果half消息写入成功就进行本地事务的执行,若写入失败就不再向下执行。
2.生产者没接收到half写入状态
如果我们把half消息发送给MQ了,MQ给保存下来了,但是MQ返回给我们的响应生产者没收到,会怎么样?
这时候,生产者会误以为发送到MQ的half消息失败了,就不会执行后边的流程。
但MQ已经保存下来了一条half消息,这个消息怎么处理?
RocketMQ有一个补偿机制,他会去扫描自己处于half状态的消息,如果我们一直没有对这个消息执行commit或rollback操作,超过了一定的时间,他就会回调自己定义的回查接口看看事务的状态,看看是否commit/rollback。
3、生产者本地事务执行过程
在执行本地事务之后,执行的结果会发送到broker端,若为commit,那么消费端会看到这条消息进行消费,若为执行失败就进行删除消息。
若发送commit或者rollback,然后mq没有收到,此时也会进行回查。