Javaer 进阶必看的 RocketMQ ,就这篇了(中)

简介: Javaer 进阶必看的 RocketMQ ,就这篇了(中)

小结一下


Producer 每 30s 会向 NameSrv 拉取路由信息更新本地路由表,有新的 Broker 就和其建立长连接,每隔 30s 发送心跳给 Broker 。

不要在生产环境开启 autoCreateTopicEnable。

Producer 会通过重试和延迟机制提升消息发送的高可用。


Broker


Broker 就比较复杂一些了,但是非常重要。大致分为以下五大模块,我们来看一下官网的图。


image.png


  • Remoting 远程模块,处理客户请求。
  • Client Manager 管理客户端,维护订阅的主题。
  • Store Service 提供消息存储查询服务。
  • HA Serivce,主从同步高可用。
  • Index Serivce,通过指定key 建立索引,便于查询。

有几个模块没啥可说的就不分析了,先看看存储的。


Broker 的存储


RocketMQ 存储用的是本地文件存储系统,效率高也可靠。

主要涉及到三种类型的文件,分别是 CommitLog、ConsumeQueue、IndexFile。


CommitLog

RocketMQ 的所有主题的消息都存在 CommitLog 中,单个 CommitLog 默认 1G,并且文件名以起始偏移量命名,固定 20 位,不足则前面补 0,比如 00000000000000000000 代表了第一个文件,第二个文件名就是 00000000001073741824,表明起始偏移量为 1073741824,以这样的方式命名用偏移量就能找到对应的文件。

所有消息都是顺序写入的,超过文件大小则开启下一个文件。


ConsumeQueue

ConsumeQueue 消息消费队列,可以认为是 CommitLog 中消息的索引,因为 CommitLog 是糅合了所有主题的消息,所以通过索引才能更加高效的查找消息。

ConsumeQueue 存储的条目是固定大小,只会存储 8 字节的 commitlog 物理偏移量,4 字节的消息长度和 8 字节 Tag 的哈希值,固定 20 字节。

在实际存储中,ConsumeQueue 对应的是一个Topic 下的某个 Queue,每个文件约 5.72M,由 30w 条数据组成。

消费者是先从 ConsumeQueue 来得到消息真实的物理地址,然后再去 CommitLog 获取消息。


IndexFile

IndexFile 就是索引文件,是额外提供查找消息的手段,不影响主流程。

通过 Key 或者时间区间来查询对应的消息,文件名以创建时间戳命名,固定的单个 IndexFile 文件大小约为400M,一个 IndexFile 存储 2000W个索引。

我们再来看看以上三种文件的内容是如何生成的:


image.png


消息到了先存储到 Commitlog,然后会有一个 ReputMessageService 线程接近实时地将消息转发给消息消费队列文件与索引文件,也就是说是异步生成的。


消息刷盘机制


RocketMQ 提供消息同步刷盘和异步刷盘两个选择,关于刷盘我们都知道效率比较低,单纯存入内存中的话效率是最高的,但是可靠性不高,影响消息可靠性的情况大致有以下几种:

  1. Broker 被暴力关闭,比如 kill -9
  2. Broker 挂了
  3. 操作系统挂了
  4. 机器断电
  5. 机器坏了,开不了机
  6. 磁盘坏了

如果都是 1-4 的情况,同步刷盘肯定没问题,异步的话就有可能丢失部分消息,5 和 6就得依靠副本机制了,如果同步双写肯定是稳的,但是性能太差,如果异步则有可能丢失部分消息。

所以需要看场景来使用同步、异步刷盘和副本双写机制。


页缓存与内存映射


Commitlog 是混合存储的,所以所有消息的写入就是顺序写入,对文件的顺序写入和内存的写入速度基本上没什么差别。


并且 RocketMQ 的文件都利用了内存映射即 Mmap,将程序虚拟页面直接映射到页缓存上,无需有内核态再往用户态的拷贝,来看一下我之前文章画的图。


image.png





相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
4月前
|
消息中间件 SQL 容灾
深度剖析 RocketMQ 5.0,消息进阶:如何支撑复杂业务消息场景?
本文主要学习 RocketMQ 的一致性特性,一致性对于交易、金融都是刚需。从大规模复杂业务出发,学习 RocketMQ 的 SQL 订阅、定时消息等特性。再从高可用的角度来看,这里更多的是大型公司对于高阶可用性的要求,如同城容灾、异地多活等。
108500 287
|
消息中间件 SQL 容灾
Apache RocketMQ 5.0 消息进阶,如何支撑复杂的业务消息场景
本篇文章介绍了很多 RocketMQ 的高阶特性。包括一致性的特性还有定时消息以及介绍了 RMQ 在高阶的容灾能力方面的建设,提供了一个异地多活的解决方案。
|
消息中间件 存储 缓存
一张图进阶 RocketMQ - 消费者这个大冤种!
三此君看了好几本书,看了很多遍源码整理的 一张图进阶 RocketMQ 图片,关于 RocketMQ 你只需要记住这张图! 本以为仅仅是 Broker 把消息推给消费者,消费者消费了就完事了。可是从消费者启动、消息拉取、消息消费、负载均衡、到结果处理中的消息重试和消费位移管理。消费者这个大冤种,纯纯打工人是石锤了。
48436 12
一张图进阶 RocketMQ - 消费者这个大冤种!
|
消息中间件 Apache RocketMQ
RocketMQ进阶 - 事务消息
RocketMQ进阶 - 事务消息
335 0
|
消息中间件 Shell RocketMQ
RocketMQ进阶-延时消息
RocketMQ进阶-延时消息
1104 0
|
消息中间件 Apache RocketMQ
RocketMQ进阶-事务消息
RocketMQ进阶-事务消息
136 0
|
消息中间件 存储 缓存
一张图进阶 RocketMQ - 消息存储
三此君看了好几本书,看了很多遍源码整理的 一张图进阶 RocketMQ 图片链接,关于 RocketMQ 你只需要记住这张图。 今天主要聊一聊 RocketMQ 消息的存储:消息的存储结构,Broker启动流程,消息的存储流程等。
2559 5
一张图进阶 RocketMQ - 消息存储
|
消息中间件 存储 缓存
Javaer 进阶必看的 RocketMQ ,就这篇了(下)
Javaer 进阶必看的 RocketMQ ,就这篇了(下)
|
消息中间件 算法 Java
弥补延时消息的不足,RocketMQ 基于时间轮算法实现了定时消息!
弥补延时消息的不足,RocketMQ 基于时间轮算法实现了定时消息!
727 1
弥补延时消息的不足,RocketMQ 基于时间轮算法实现了定时消息!
|
消息中间件 uml RocketMQ
3 张图带你彻底理解 RocketMQ 事务消息
3 张图带你彻底理解 RocketMQ 事务消息
67739 2
3 张图带你彻底理解 RocketMQ 事务消息