1. comitlog文件
  2. ConsumerQueue文件
  3. IndexFile文件

RocketMQ将所有主题的消息存储在同一个文件中,确保消息发送时顺序写文件。

为了提高消息消费的效率RocketMQ引入了ConsumeQueue消息队列文件,每个消息主题包含一个多个消息消费队列,每一个消费队列有一个消费文件。消息到达CommitLog文件后,将异步转发到消息消费队列

为了加速消息的检索性能,引入IndexFile索引文件,根据消息的属性快速从Commitlog文件中检索消息。存储消息Key与Offset的对应关系。

  1. messageStoreConfig消息存储配置属性
  2. commitLog文件的存储实现类
  3. consumeQueueTable消息队列缓存列表,按消息主题分组
  4. flushConsumeQueueService消息队列文件ConsumeQueue刷盘线程
  5. cleanCommitLogService清除CommitLog文件服务
  6. cleanConsumeQueueService 清除ConsumeQueue文件服务
  7. indexService 索引文件实现类
  8. allocateMappedFileService MappedFile分配服务
  9. reputMessageService  commitLog消息分发,根据CommitLog文件构建ConsumeQueue,IndexFile。
  10. haService存储HA机制
  11. transientStorePool消息堆内存缓存
  12. MessageArrivingListener 消息拉去长轮询模式达到监听器
  13. brokerConfig。Broker配置属性
  14. storeCheckpoint 文件刷盘检查点
  15. 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消息存储的更多相关文章

  1. 【mq读书笔记】消息队列负载与重新分配(分配 新队列pullRequest入队)

    回顾PullMessageService#run: 如果队列总没有PullRequest对象,线程将阻塞. 围绕PullRequest有2个问题: 1.PullRequest对象在什么时候创建并加入p ...

  2. 【mq读书笔记】消息消费队列和索引文件的更新

    ConsumeQueue,IndexFile需要及时更新,否则无法及时被消费,根据消息属性查找消息也会出现较大延迟. mq通过开启一个线程ReputMessageService来准时转发commitL ...

  3. 【mq读书笔记】mq事务消息

    关于mq食物以什么样的方式解决了什么样的问题可以参考这里: https://www.jianshu.com/p/cc5c10221aa1 上文中示例基于mq版本较低较新的版本中TransactionL ...

  4. 【mq读书笔记】如何保证三个消息文件的最终一致性。

    考虑转发任务未成功执行,此时消息服务器Broker宕机,导致commitlog,consumeQueue,IndexFile文件数据不一致. commitlog,consumeQueue遍历每一条消息 ...

  5. 【mq读书笔记】mq读写分离机制

    mq根据brokerName查找Broker地址的过程 mq根据MessageQueue查找Broker地址的唯一依据是brokerName,同一组Broker(M-S)他们的bokerName相同但 ...

  6. 【mq读书笔记】顺序消息

    注意异常情况导致整个消费无限重试 阻塞消费 mq支持局部消息顺序消费,可以确保同一个消息消费队列中的消息被顺序消费.看下针对顺序消息在整个消费过程中做的调整: 队列负载: DefaultMQPushC ...

  7. 【mq读书笔记】消息过滤机制

    mq支持表达式过滤和类过滤两种模式,其中表达式又分为TAG和SQL92.类过滤模式允许提交一个过滤类到FilterServer,消息消费者从FilterServer拉取消息,消息经过FilterSer ...

  8. 【mq读书笔记】定时消息

    mq不支持任意的时间京都,如果要支持,不可避免的需要在Broker层做消息排序,加上持久化方面的考量,将不可避免地带来巨大的性能消耗,所以rocketMQ只支持特定级别的延迟消息. 在Broker短通 ...

  9. 【mq读书笔记】消费进度管理

    从前2节可以看到,一次消费后消息会从ProcessQueue处理队列中移除该批消息,返回ProcessQueue最小偏移量,并存入消息进度表中.那消息进度文件存储在哪合适呢? 广播模式:同一个消费组的 ...

随机推荐

  1. sqlsugar入门(4)-修改源码支持多主键保存ISaveable

    1.查看其它接口发现少了一个最重要的SaveBuilder.此文件是存放sql模板,where条件,select解析,组装成tosqlstring的最后一个类. 添加文件 using System; ...

  2. 【快速因数分解】Pollard's Rho 算法

    Pollard-Rho 是一个很神奇的算法,用于在 $O(n^{\frac{1}4}) $的期望时间复杂度内计算合数 n 的某个非平凡因子(除了1和它本身以外能整除它的数).事书上给出的复杂度是 \( ...

  3. 【Kata Daily 190927】Counting sheep...(数绵羊)

    题目: Consider an array of sheep where some sheep may be missing from their place. We need a function ...

  4. SpringBoot入门最简单的一个项目示例

    使用IDEA创建一个SpringBoot项目 1.1 打开IDEA,文件-New-Project 1.2下一步,选择版本8(根据自己安装的JDK版本来选择) 1.3 下一步后点击Web,勾选Sprin ...

  5. CORS与Django

    前言 在前后端分离项目中,如何解决跨域请求是一个必须要面对的问题.因为前端和后端的数据交互会被浏览器的同源策略所挟持,在很早之前我在博客园发了一篇文章,大概就说了一下如何简单粗暴的解决跨域. 其实那种 ...

  6. 把数据转化为JSON格式用ajax进行前后端交互

    接着在https://www.cnblogs.com/dong973711/p/10907733.html的基础上做验证. 从前端提交数据 前端页面,submit.html <!DOCTYPE ...

  7. 面试题:对NotNull字段插入Null值 有啥现象?

    Hi,大家好!我是白日梦. 今天我要跟你分享的话题是:"对NotNull字段插入Null值有啥现象?" 一. 推荐阅读 首发地址:https://mp.weixin.qq.com/ ...

  8. 理解js参数

    <!DOCTYPE html><html><head> <meta charset="utf-8" /> <title> ...

  9. mdp文件-Chapter4-MD.mdp

    终于到了mdp系列的第四篇,最终MD模拟的mdp文件 先上代码,md.mdp 1 title = OPLS Lysozyme MD simulation 2 ; Run parameters 3 in ...

  10. brctl 增加桥接网卡

    前言 之前有一篇介绍配置桥接网卡的,这个桥接网卡一般是手动做虚拟化的时候会用到,通过修改网卡的配置文件的方式会改变环境的原有的配置,而很多情况,我只是简单的用一下,并且尽量不要把网络搞断了,万一有问题 ...