RocketMQ零碎知识点
1.事务消息如何保证
2.事务消息执行流程
- 1.应用程序完成本地事务后,同步调用MQ消息发送接口,发送状态为prepare的消息,发送成功后等待本地事务的执行情况。为两阶段提交的第一阶段
- 2.同时MQ会将prepare消息备份其主题和消息队列,将消息存储在RMQ_SYS_TRANS_HALF_TOPIC的消息消费队列中,然后会开启一个定时任务,消费该消息队列的消息,并向应用程序发起消息事务状态回查,根据反馈的状态之下,同时设有回查次数,超过次数未获取到状态,默认回滚。此为定时任务回查
- 3.根据本地事务的返回状态执行提交,回滚,然后结束事务。此为两阶段提交的第二阶段
3.消息的存储
- Commitlog 存储所有主题的消息,顺序写入,通过文件名表示的偏移量来定位第一条消息
- ConsumeQueue 相当于主题跟队列的索引,一个消费队列对应一个文件,异步将消息转发到该队列
- IndexFile 加速消息的检索,主要存储消息Key和Offset的对应关系
4.过期文件删除机制
- 非当前写文件在一定时间间隔内没有被再次更新,则认为是过期文件,可以直接删除。时间间隔默认72小时
5.消息存储最终一致性保证
- 当Broker由于某个原因宕机,会导致存储的三个文件不一致
- 若Broker上一次是异常退出,会在store目录下留下一个abort文件,这个abort文件是通过启动创建,正常退出时通过JVM钩子函数删除该文件,因此下一次启动时存在该文件,说明为异常退出,需要进行数据修复