RocketMQ存储篇——事务消息相关的文件
来源:互联网 发布:纯棉风衣 知乎 编辑:程序博客网 时间:2024/06/09 22:48
在RocketMQ-3.1.9版本中,有TransactionStateService类,用于存储每条事务消息的状态。在该类中有两个成员变量tranRedoLog:ConsumeQueue和tranStateTable: MapedFileQueue,其中tranRedoLog变量用于事务状态的Redolog,当进程意外宕掉,可通过redolog恢复所有事务的状态,tranStateTable变量用于存储事务消息的事务状态。
1 事务消息状态文件
tranStateTable变量对应的物理文件的存储路径默认为$HOME/store /transaction/statetable/{fileName},每个文件由2000000条数据组成,每条数据总共有24个字节,其结构如下,因此每个文件的大小为2000000*24;
每个statetable文件的名称fileName,名字长度为20位,左边补零,剩余为起始偏移量;比如00000000000000000000代表了第一个文件,起始偏移量为0,文件大小为2000000*24,当第一个文件满之后创建的第二个文件的名字为00000000000048000000,起始偏移量为48000000,以此类推,第三个文件名字为00000000000096000000,起始偏移量为96000000,消息存储的时候会顺序写入文件,当文件满了,写入下一个文件。
2 事务消息REDO日志文件
tranRedoLog变量对应的物理文件的存储路径默认为$HOME/store /transaction/redolog/TRANSACTION_REDOLOG_TOPIC_XXXX/0/{fileName},每个文件由2000000条数据组成,每条数据总共有20个字节,因此每个文件的大小为2000000*20,每条数据的结构与ConsumeQueue文件一样,相当于topic值等于“TRANSACTION_REDOLOG_TOPIC_XXXX”,queueId等于0。
每个redolog文件的名称fileName,名字长度为20位,左边补零,剩余为起始偏移量;比如00000000000000000000代表了第一个文件,起始偏移量为0,文件大小为200W*20,当第一个文件满之后创建的第二个文件的名字为00000000000040000000,起始偏移量为40000000,以此类推,第三个文件名字为00000000000080000000,起始偏移量为80000000,消息存储的时候会顺序写入文件,当文件满了,写入下一个文件。
3 定期向Producer回查事务消息的最新状态
在Broker启动TransactionStateService时,为每个tranStateTable文件创建了一个定时任务,该定时任务是每隔1分钟遍历一遍文件中的所有消息,对于处于PREPARED状态的事务消息,向Producer发送回查请求获取最新的事务状态。
为每个tranStateTable文件创建的定时任务的大致逻辑如下:
1、检查该Broker是否为备用,若是则跳出本次回查,不进行回查操作;
2、若未开启回查功能(即MessageStoreConfig. CheckTransactionMessageEnable为false)则跳出本次回查,不进行回查操作;
3、从tranStateTable文件的开头位置遍历每个消息,若该消息的事务状态不是PREPARED则继续遍历下一个消息,即只回查状态为PREPARED的事务消息;若该消息存储的时间距离当前时间小于了间隔时间(由参数MessageStoreConfig.checkTransactionMessageAtleastInterval设置,默认是60秒)则跳出本次回查;
4、调用DefaultTransactionCheckExecuter.gotoCheck(int producerGroupHashCode, long tranStateTableOffset, long commitLogOffset, int msgSize)方法,其中tranStateTableOffset为该消息在tranStateTable文件中的消息位置偏移量,向Producer发送CHECK_TRANSACTION_STATE请求码,大致逻辑如下:
4.1)根据producerGroupHashCode从ProducerManager. hashcodeChannelTable变量中获取渠道信息ClientChannelInfo对象;
4.2)以commitLogOffset从CommitLog中查询事务消息内容,封装成SelectMapedBufferResult对象;
4.3)构建CheckTransactionStateRequestHeader对象,其中该对象的tranStateTableOffset变量等于入参tranStateTableOffset值;
4.4)调用Broker2Client.checkProducerTransactionState(Channel channel, CheckTransactionStateRequestHeader requestHeader, SelectMapedBufferResult selectMapedBufferResult)方法向Producer发送CHECK_TRANSACTION_STATE请求码,将事务消息内容也一发给了Producer端;
- RocketMQ存储篇——事务消息相关的文件
- RocketMQ存储篇——Config文件以及执行延迟消息的线程服务
- RocketMQ的消息存储
- RocketMQ——Producer篇:发送事务消息
- rocketmq事务消息的理解
- RocketMQ源码解析-Broker的消息存储
- RocketMQ源码学习--消息存储篇
- RocketMQ(5)——消息文件过期原理
- RocketMQ源码解析:事务消息
- RocketMQ存储篇——MapedFileQueue
- RocketMQ存储篇——CommitLog
- RocketMQ存储篇——Consumequeue
- RocketMQ——顺序消息
- RocketMQ源码解析-事务消息的二阶段提交
- 分布式消息队列RocketMQ--事务消息--解决分布式事务的最佳实践
- 分布式消息队列RocketMQ--事务消息--解决分布式事务的最佳实践
- 分布式消息队列RocketMQ--事务消息--解决分布式事务的最佳实践
- 分布式消息队列RocketMQ--事务消息--解决分布式事务的最佳实践
- 网页抓取数据
- github入门到上传本地项目
- c3p0连接 oracle 12c 版本时提示error: ORA-12505的解决方法
- 求解count返回值!
- 仿闲鱼tabbar加二次点击刷新
- RocketMQ存储篇——事务消息相关的文件
- jquery的上传插件ocupload与图表插件highcharts
- awk 内置字符串函数简介
- 米斯特白帽子WEB安全攻防培训-信息收集2
- 干货——从《测试之美》前两章认识测试工程师
- Mac OS X 开发(unity嵌入式开发)
- ClientAbortException: java.net.SocketException: Broken pipe 异常
- 经典问题:对于一个m*n的网格,从左上角的方格到右下角的方格,共有多少条路径(只允许向右和向下)
- n-1位数