面试题:RocketMQ事务消息机制的底层实现原理

1 回顾写入流程

其实你写入一个topic,最终是定位到这个topic的某个messageQueue,然后定位到一台broker,然后写入的是broker上的commitlog文件,同时将消费索引写入到messagequeue对应的consumerQueue文件
然后正常情况下然后业务系统按理说会从这个ConsumeQueue里获取到你写入的这个消息

2 half 消息是如何对消费者不可见的?

但是实际上消费者–业务系统却没法看到这条消息,
其本质原因就是RocketMQ一旦发现你发送的是一个half消息,他不会把这个half消息的offset写入原始topic的ConsumeQueue里去。
而是会把这条half消息写入到自己内部的“RMQ_SYS_TRANS_HALF_TOPIC”这个Topic对应的一个ConsumeQueue里去

3 在什么情况下订单系统会收到half消息成功的响应?

必须要在half消息进入到Rocketmq内部的RMQ_SYS_TRANS_HALF_TOPIC的consumer文件中,此时就会认为half消息写入成功了,然后就会返回响应给业务系统

4、假如因为各种问题,没有执行rollback或者commit会怎么样?

rocketmq后台有定时任务,定时任务会去扫描RMQ_SYS_TRANS_HALF_TOPIC中的half消息,
如果你超过一定时间还是half消息,他会回调业务系统的接口,让你判断这个half消息是要rollback还是commit

另外给大家说一下,假设你一直没有执行commit/rollback,
RocketMQ会回调业务系统的接口去判断half消息的状态,但是他最多就是回调15次,
如果15次之后你都没法告知他half消息的状态,就自动把消息标记为rollback。

5、如果执行rollback操作的话,如何标记消息回滚?

因为RocketMQ都是顺序把消息写入磁盘文件的,所以在这里如果你执行rollback,他的本质就是用一个OP操作来标记half消息的状态RocketMQ内部有一个OP_TOPIC,
此时可以写一条rollback OP记录到这个Topic里,标记某个half消息是rollback了

6、如果执行commit操作,如何让消息对红包系统可见?

你执行commit操作之后,RocketMQ就会在OP_TOPIC里写入一条记录,标记half消息已经是commit状态了。
接着需要把放在RMQ_SYS_TRANS_HALF_TOPIC中的half消息给写入到原始Topic的ConsumeQueue里去,然后我们的红包系统可以就可以看到这条消息进行消费了

你可能感兴趣的:(消息中间件,java,分布式,数据库)