【mq读书笔记】mq消息存储
- comitlog文件
- ConsumerQueue文件
- IndexFile文件
RocketMQ将所有主题的消息存储在同一个文件中,确保消息发送时顺序写文件。
为了提高消息消费的效率RocketMQ引入了ConsumeQueue消息队列文件,每个消息主题包含一个多个消息消费队列,每一个消费队列有一个消费文件。消息到达CommitLog文件后,将异步转发到消息消费队列
为了加速消息的检索性能,引入IndexFile索引文件,根据消息的属性快速从Commitlog文件中检索消息。存储消息Key与Offset的对应关系。

- messageStoreConfig消息存储配置属性
- commitLog文件的存储实现类
- consumeQueueTable消息队列缓存列表,按消息主题分组
- flushConsumeQueueService消息队列文件ConsumeQueue刷盘线程
- cleanCommitLogService清除CommitLog文件服务
- cleanConsumeQueueService 清除ConsumeQueue文件服务
- indexService 索引文件实现类
- allocateMappedFileService MappedFile分配服务
- reputMessageService commitLog消息分发,根据CommitLog文件构建ConsumeQueue,IndexFile。
- haService存储HA机制
- transientStorePool消息堆内存缓存
- MessageArrivingListener 消息拉去长轮询模式达到监听器
- brokerConfig。Broker配置属性
- storeCheckpoint 文件刷盘检查点
- dispatcherList。CommitLog文件转发请求


设置消息存储的时间,如果mappedFile为空表明commitlog目录下不存在任何文件,说明本次消息是第一次消息发送,用偏移量0创建第一个commit文件,如果文件创建失败,抛出CREATE_MAPEDFILE_FAILED,很有可能是磁盘空间不足或权限不够


msgId=4字节IP+4字节端口号+8字节消息偏移量


消息存储格式(略)



至此消息已经刷到内存中,返回的结果如下

若此时将put_ok作为结果返回(异步刷盘,)则客户端收到消息成功的结果之后,服务器宕机没刷到磁盘的消息会丢失。
再看PutMessageResult返回之前的刷盘:


同步刷盘的情况下 会因为等待刷盘超时将PUT_OK更新成FLUSH_DISK_TIMEOUT,默认情况为 ASYNC_FLUSH 修改flushDiskType = SYNC_FLUSH还用同步刷盘。
进一步看下消息主从同步之后的结果:

可以看slave不可用的时候会更新为SLAVE_NOT_AVAILABLE或者FLUSH_NOT_AVAILABLE
此时若master宕机,没有同步到slave的消息就会丢失
默认为 ASYNC_MASTER 修改brokerRole=SYNC_MASTER 改用同步复制。
但是以上都不会再更新AppendMessageResukt,最后返回给客户端都会被认为消息发送成功的
org.apache.rocketmq.broker.processor.SendMessageProcessor#handlePutMessageResult:

再看下客户端producer怎么处理这几种情况的:

可以看到当sendStaus!=OK的时候 会根据设置进行重试,但在重试达到最大次数 默认2,就会直接将结果sendResult返回给业务调用方:

综上说书,如果要保证严格的不丢消息的情况:
broker 需要采用如下配置:

同时这个过程我们还需要生产者配合,判断返回状态是否是 SendStatus.SEND_OK。若是其他状态,就需要考虑补偿重试。
虽然上述配置提高消息的高可靠性,但是会降低性能,生产实践中需要综合选择
【mq读书笔记】mq消息存储的更多相关文章
- 【mq读书笔记】消息队列负载与重新分配(分配 新队列pullRequest入队)
回顾PullMessageService#run: 如果队列总没有PullRequest对象,线程将阻塞. 围绕PullRequest有2个问题: 1.PullRequest对象在什么时候创建并加入p ...
- 【mq读书笔记】消息消费队列和索引文件的更新
ConsumeQueue,IndexFile需要及时更新,否则无法及时被消费,根据消息属性查找消息也会出现较大延迟. mq通过开启一个线程ReputMessageService来准时转发commitL ...
- 【mq读书笔记】mq事务消息
关于mq食物以什么样的方式解决了什么样的问题可以参考这里: https://www.jianshu.com/p/cc5c10221aa1 上文中示例基于mq版本较低较新的版本中TransactionL ...
- 【mq读书笔记】如何保证三个消息文件的最终一致性。
考虑转发任务未成功执行,此时消息服务器Broker宕机,导致commitlog,consumeQueue,IndexFile文件数据不一致. commitlog,consumeQueue遍历每一条消息 ...
- 【mq读书笔记】mq读写分离机制
mq根据brokerName查找Broker地址的过程 mq根据MessageQueue查找Broker地址的唯一依据是brokerName,同一组Broker(M-S)他们的bokerName相同但 ...
- 【mq读书笔记】顺序消息
注意异常情况导致整个消费无限重试 阻塞消费 mq支持局部消息顺序消费,可以确保同一个消息消费队列中的消息被顺序消费.看下针对顺序消息在整个消费过程中做的调整: 队列负载: DefaultMQPushC ...
- 【mq读书笔记】消息过滤机制
mq支持表达式过滤和类过滤两种模式,其中表达式又分为TAG和SQL92.类过滤模式允许提交一个过滤类到FilterServer,消息消费者从FilterServer拉取消息,消息经过FilterSer ...
- 【mq读书笔记】定时消息
mq不支持任意的时间京都,如果要支持,不可避免的需要在Broker层做消息排序,加上持久化方面的考量,将不可避免地带来巨大的性能消耗,所以rocketMQ只支持特定级别的延迟消息. 在Broker短通 ...
- 【mq读书笔记】消费进度管理
从前2节可以看到,一次消费后消息会从ProcessQueue处理队列中移除该批消息,返回ProcessQueue最小偏移量,并存入消息进度表中.那消息进度文件存储在哪合适呢? 广播模式:同一个消费组的 ...
随机推荐
- python 作业 批量读取excel文件并合并为一张excel
1 #!/usr/bin/env python 2 # coding: utf-8 3 4 def concat_file(a,b): 5 #如何批量读取并快速合并文件夹中的excel文件 6 imp ...
- LuoguP4704 太极剑
题面 测试要求 Bob 尽可能快地切断 n 根绳子. 所有绳子的端点两两不同,所以共有 2n 个端点.这些端点被捆在一个圆上,等距离分布.我们把这些端点按顺时针方向编号为 1 到 2n. Bob 每次 ...
- VisualCalendar-可视化日历的创建
public class VisualCalendar { public static void main(String[]args){ System.out.println("请输入日期( ...
- sharding-jdbc 分库分表的 4种分片策略,还蛮简单的
上文<快速入门分库分表中间件 Sharding-JDBC (必修课)>中介绍了 sharding-jdbc 的基础概念,还搭建了一个简单的数据分片案例,但实际开发场景中要远比这复杂的多,我 ...
- Python爬虫练习(requests模块)
Python爬虫练习(requests模块) 关注公众号"轻松学编程"了解更多. 一.使用正则表达式解析页面和提取数据 1.爬取动态数据(js格式) 爬取http://fund.e ...
- 水题挑战4: luogu P1280 尼克的任务
题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为 \(n\) 分钟,从 ...
- [C#] (原创)一步一步教你自定义控件——04,ProgressBar(进度条)
一.前言 技术没有先进与落后,只有合适与不合适. 本篇的自定义控件是:进度条(ProgressBar). 进度条的实现方式多种多样,主流的方式有:使用多张图片去实现.使用1个或2个Panel放到Use ...
- JUC 包下工具类,它的名字叫 LockSupport !你造么?
前言 LockSupport 是 JUC 中常用的一个工具类,主要作用是挂起和唤醒线程.在阅读 JUC 源码中经常看到,所以很有必要了解一下. 公众号:liuzhihangs ,记录工作学习中的技术. ...
- js 元素添加多个监听
function addListener(element,e,fn){ if(element.addEventListener){ element.addEventListen ...
- 《为研发同学定制的MySQL面试指南》-- 连载中
Hi大家好,我是来自博客园的赐我白日梦! 为大家带来MySQL面试专题!全文110篇!以问答的方式,由浅入深的帮你应对各类MySQL面试题的狂轰滥炸!当然也不乏会分享一些高阶读写分离数据库中间件原理及 ...