深入拆解消息队列 47 讲
许文强
前腾讯云 Kafka 技术负责人
5385 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
深入拆解消息队列 47 讲
15
15
1.0x
00:00/00:00
登录|注册

11|从基础功能拆解RocketMQ的架构设计与实现

你好,我是文强。
上节课我们分析了 RabbitMQ 在通信协议、网络模块、存储模块、生产者、消费者这五个模块的设计思路。这节课我们用同一个思路来讲讲 RocketMQ。
有一个蛮有意思的现象,从我们的统计数据来看,RabbitMQ 的用户数是最多的。但是在程序员的口碑中,RocketMQ 无论是从性能还是稳定性上都是优于 RabbitMQ 的。从我个人来看,RocketMQ 可以当作 RabbitMQ 的替代品,因为 RocketMQ 在功能、稳定性、性能层面都比 RabbitMQ 的表现更好。所以我们一起来看看为什么吧。

RocketMQ 系统架构

在正式讲解之前,我们先来看一下 RocketMQ 的架构图。
如下图所示,RocketMQ 由 ProducerNameServerBrokerConsumer 四大模块组成。其中,NameServer 是 RocketMQ 的元数据存储组件。另外,在 RocketMQ 5.0 后,还增加了 Proxy 模块,用来支持 gRPC 协议,并为后续的计算存储分离架构做准备。
RocketMQ 有 Topic、MessageQueue、Group 的概念,一个 Topic 可以包含一个或多个 MessageQueue,一个 Group 可以订阅一个或多个 Topic。MessageQueue 是具体消息数据的存储单元,订阅的时候通过 Group 来管理消费订阅关系。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

RocketMQ是一个开源的消息中间件系统,本文从架构设计和实现角度对其进行了拆解。文章首先介绍了RocketMQ的系统架构,包括Producer、NameServer、Broker和Consumer四大模块,并解释了它们之间的关系。在讲解协议和网络模块时,文章提到RocketMQ支持自定义的Remoting协议和gRPC协议,并分析了它们的优劣势。接着,文章详细介绍了RocketMQ的数据存储模块,包括元数据存储和消息数据存储,以及它们的实现细节。最后,文章讨论了RocketMQ的生产者和消费者的实现方式,包括客户端寻址和与Broker的交互过程。 在生产端,RocketMQ支持单向发送、同步发送、异步发送三种发送形式,并介绍了消息发送到Topic或Queue的过程。而在消费端,RocketMQ支持Pull、Push、Pop三种消费模型,以及消费分组、消费负载均衡和消费位点的管理。此外,文章还提到了RocketMQ对HTTP协议的支持和集群管控操作的实现。 总的来说,RocketMQ在协议层支持Remoting和gRPC两种协议,在网络层基于Java NIO框架Netty开发,存储层采用多个MessageQueue的数据统一存储到一个文件的设计思路,并支持分段存储和基于时间的数据过期机制。元数据存储是通过Broker和自定义的NameServer之间的配合实现的,而客户端的访问需要经过客户端寻址机制。生产端和消费端的全过程也得到了详细描述。 总的来说,本文通过对RocketMQ架构设计和实现的拆解,为读者提供了深入了解RocketMQ技

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解消息队列 47 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(9)

  • 最新
  • 精选
  • 张申傲
    小建议:架构图中的Partition是不是换成MessageQueue好一点?虽然概念上是一致的~

    作者回复: 收到,感谢提醒,我们调整一下~

    2023-07-14归属地:北京
    3
  • pop模式优点 1.每个消费者都可以消费到所有queue的消息,消费者不用再关心重平衡。 2.消费者不与某个queue强绑定,不会因为某个消费者hang住导致某个queue堆积。 但是按照 "消息粒度负载均衡" 来消费数据不是也是同样的效果吗?为什么还要实现这个pop模式?

    作者回复: Pop 模型主要用来解决下面三个消费组机制存在问题: 1. 客户端实现较重。 2. 重平衡会暂停消费和重平衡时间不可控,导致的消费停止或消费慢的问题。 3. 分区消费可能会存在倾斜。 "消息粒度负载均衡" 的消费模式可以解决消费倾斜的问题。但是它的底层是基于消费组的机制来实现的。所以依旧会存在上面的问题1和2。 而Pop希望主要想解决的就是1和2,让客户端无状态、更轻量,这样对多语言的支持也比较友好,同时解决重平衡带来的消费慢、消费停滞的问题。

    2023-07-27归属地:广东
    1
  • aoe
    原来支持 gRPC 是为了简化多语言 SDK 的开发

    作者回复: 从原始的设计初衷来看,有这一点的考虑的。在这一方面确实能带来一定的好处。

    2023-07-16归属地:浙江
  • cykuo
    首先在生产者开始生产消息,包括根据remoting协议序列化消息内容,然后尝试访问namesrv获取所有broker信息,然后根据自己发送消息topic消息决定将数据投递到具体哪个broker上。投递动作根据投递方式的不同分为同步发送,异步等发送方式的不同略有差异。消息在投递到broker之后,如果是发送到topic中,则需要在broker上完成生产分发的工作,决定消息最后投递到哪个queue上。如果是投递到queue则可以省略这一步。(这里不管是topic还是queue应该都是逻辑概念,通过索引所描述的在commitLog中的逻辑关系所决定的)。最后在consumer侧,则默认是使用pull模式来拉取消息,首先从namesrv中获取所有broker的信息,进而确定自己需要的数据坐标信息,在拉取消息之后还有提交消费位点等动作,另外在消费侧还有其他的消费模式POP/PUSH(这里问作者一个问题,POP模式是否可以避免因为消费者的rebalance?当然broker自身导致的rebalance是无法避免的。。。)
    2023-07-14归属地:北京
    3
  • 赵海升
    许老师 这个消息粒度负载均衡 的配图有点小疑惑 , R3 和 R5 的 不被消费吗 ?R2 R4 别同一个消费组的cosume1 消费两次?这图是不是有问题
    2023-07-17归属地:上海
    1
    1
  • 开发很忙
    Pull模型和Pop模型的区别是消费重平衡的工作在客户端完成和在服务端完成吗?
    2023-09-19归属地:广东
  • shan
    总结 协议网络模块 RocketMQ 5.0以前使用的是自定义的Remoting协议,5.0以后增加了gRPC协议的支持,Remoting基于四层的TCP协议通信,gRPC基于七层的HTTP2协议通信,不过底层也是基于TCP。 Remoting是私有协议,在多语言SDK开发时,一些基础的工作都需要重新开发,而且与第三方服务集成不便捷。 gRPC是公有协议,底层已经实现了网络通信、编解码等基础框架,提供了各个语言的开发库,非常轻便,并且有天然的生态集成能力,比如Service Mesh、Kubernetes等。 元数据存储 Broker中存储了元数据信息,在启动的时候会向所有NameServer上报自己负责的Topic有哪些,消息队列有哪些,之后生产者和消费者就可以通过NameServer获取Topic的路由信息。 NameServer一般是多节点部署,每个节点之间是对等的,没有主从之分。 消息数据存储 RocketMQ一般会将Topic划分为多个MessageQueue,不过在底层文件存储方面,所有MessageQueue都对应一个CommitLog,消息会被顺序写入CommitLog文件。单个CommitLog大小为1G,超出限定之后会新起一个文件。 ConsumeQueue是逻辑消息队列,因为CommitLog中存储的是所有消息,为了根据Topic进行检索,所以创建了ConsumeQueue,每个Topic都会有一个对应的ConsumeQueue目录,里面是该Topic下所有消息队列对应的ConsumeQueue文件,文件中记录了该消息队列里面每条消息在CommitLog中的偏移量。 消费者就是通过这个ConsumeQueue进行消息消费的。 IndexFile是为了便于根据Key对消息进行检索设计的。 ConsumeQueue和IndexFile存储的是索引数据,数据量一般不大,所以不需要分段存储。 生产者 生产者发送消息的时候,需要知道往哪个Topic上发,Topic信息可以从NameServer获取,之后会根据算法(轮询算法或者最小投递延迟算法)选取其中一个MessageQueue进行发送。 消费者 消费者支持Pull、Push、Pop 三种消费模型。 Pull模式:需要消费者主动调用poll方法获取消息,从表面上看消费者需要不断主动进行消息拉取,所以叫做拉模式。 Push模式:从名字上看起来是消息到达Broker后推送给消费者,实际上还是需要消费者向Broker发送拉取请求获取消息内容,获取之后触发回调函数进行消费,从表面上看就像是Broker主动推送给消费者一样,所以叫做推模式。 Pop模式:RocketMQ 5.0以后新增了Pop模式,它主要是将消费分区、分区分配关系、重平衡都移到了Broker端。
    2023-09-19归属地:河南
  • walle斌
    rocketmq是支持批量发送,详细查看MessageBatch 这个类
    2023-09-05归属地:北京
    1
  • Geek_8562b2
    老师,消费端和生产端消费生产时是连接到整个NameServer集群吗,还是连接到某一个NameServer节点,如果只是连接到某一个NameServer节点,那么这个节点挂掉,生产端和消费端怎么获取其他NameServer节点信息。
    2023-08-07归属地:江苏
    1
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部