论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
软件与程序人生
›
云原生
›
图解 RocketMQ 架构
图解 RocketMQ 架构
立聪堂德州十三局店
论坛元老
|
2024-8-18 16:34:21
|
显示全部楼层
|
阅读模式
楼主
主题
2291
|
帖子
2291
|
积分
6873
写在前面
Kafka、RocketMQ都是很出名的中间件,上次我们讲授了Kafka,这次我们来讲讲RocketMQ的原理。
根本架构图
剖析
RocketMQ 统共可以分成四个模块
NameServer:提供服务发现和路由功能,管理各种元数据信息。
Broker:消息存储和路由分发节点,负责存储消息和将消息路由给斲丧者。
Producer:消息生产者,负责产生并发送消息到指定的 Topic。
Consumer:消息斲丧者,订阅 Topic 并从 Broker 拉取消息进行处理。
大体读写步调
注册 Broker Cluster 到 NameServer。
注册 Producer、Consumer 到 NameServer。
Producer 获取MQ集群的Broker、Queue等信息。
Producer 发消息,一样平常消息都会选择master进行写入,而slave进行读取。
顺序写入消息到 commit log 中。
queue log会记载每条commit log的存储信息,当然不会记载所有,只记载一些重要的,commitLogOffset等等。
master 将消息异步给slave。
Consumer读取slave的消息。
Consumer返回ACK作为确认消息斲丧成功。
1. NameServer
当Broker服务启动后,会向NameServer注册信息,比如broker中的Topic、斲丧偏移量、队列、ip、端口等,由Broker的心跳发送到NameServer,BrokerCluster 中的每一个节点都会注册到NameServer上。
即使一个NameService节点挂了,剩下的一个NameService节点仍旧包含所有的broker信息。不过NameService是无状态的, NameService之间不会相互通讯,那么一个NameService挂了,不会影响别的一个NameService。
注册完Broker之后,NameServer会每隔10s发送心跳查抄Broker,如果Broker超过120s还没有相应,则这个Broker被视为宕机
2. Broker
2.1 CommitLog & Message Queue
Broker 启动,跟所有的 NameServer 保持长连接,每 30s 发送一次发送心跳包(像心跳一样持续稳定的发送哀求)。心跳包中包含当前 Broker 信息 ( IP+ 端口等)以及存储所有 Topic 信息。注册成功后,NameServer 集群中就有 Topic 跟 Broker 的映射关系。
Broker担当消息,会顺序写入消息到 CommitLog 中。Broker里面的两个存储介质:Commit log 和 Message queue的区别:
Commit log 存储消息实体。顺序写,随机读。虽然是随机读,但是使用package机制,可以批量地从磁盘读取,作为cache存到内存中,加速后续的读取速度。
Message queue 存储消息的偏移量。读消息先读 message queue,根据偏移量到 commit log 读消息本身。
所以实在我们的消息不是存放在queue中,而是存放在commit log中,这就是为什么queue会被称为逻辑队列
2.2 Index File
2.2.1 先容
因为所有的消息都存在CommitLog中,如果要实现根据 key 查询 消息的方法,就会变得非常困难,所以为相识决这种业务需求,有了IndexFile的存在。用于为天生的索引文件提供访问服务,通过消息 Key 值查询消息真正的实体内容。
IndexFile 如何创建?以创建的时间戳命名。参数:phyOffset物理偏移量(也就是commitLogOffset)、keys。
如何查询消息呢?
2.2.2 按照MessageId查询
RocketMQ中的MessageId的长度统共有16字节,此中包含了消息存储主机地址(IP地址和端口),消息Commit Log offset。
Client 端从 MessageId 中剖析出 Broker 的地址(IP地址和端口)和Commit Log的偏移地址发送一个RPC哀求。
Broker 端读取消息的过程用此中的 commitLog offset 和 size 去 commitLog 中找到真正的记载并剖析成一个完整的消息返回。
2.2.3 按照Message Key查询
找槽位:slotKey = 40 byte + hash(topic + "#" + key) % 500W * 4byte。
计算槽位:slotValue = 最新插入 index 的位置。
遍历单向链表:从 slotValue 找到最新 index 在整个索引文件中位置 = 40byte +500w*4byte + slotValue*20byte,然后根据单个索引文件的 pre index 值找到前一个索引,一直遍历下去,直到index数据中key hash和时间区间都满足即可。添加到 commitLogOffset 的 list) 中。
最终根据此中的 commitLogOffset 从 CommitLog 文件中读取消息的实体内容。
3. Producer
略。Producer似乎除了负载均衡,就没什么好讲的地方了。
4. Consumer
在RocketMQ中,Consumer端的两种斲丧模式(Push/Pull)都是基于拉模式来获取消息的,pull必要手动实现拉取消息,push只必要实现斲丧监听器。但实际底层都是pull。
在Consumer启动后,会通过定时使命不断地向所有Broker实例发送心跳包,
包含:消息斲丧分组名称、订阅关系聚集、消息通讯模式和客户端id的值等信息
Broker端在收到Consumer的心跳消息后,会将它维护在 ConsumerManager 的本地缓存变量。会根据斲丧者组获取对应维护的斲丧者组信息。
如果是新加入的consumer获取订阅信息变了,会关照这个斲丧者组里面的其他斲丧者说斲丧者有变化,被关照到的斲丧者就会重新负载均衡。
参考
[1] https://www.modb.pro/db/141171
[2] https://www.cnblogs.com/duanxz/p/5020398.html
[3] https://www.cnblogs.com/dennyzhangdd/p/15035116.html
[4] https://www.alibabacloud.com/blog/rocketmq-5-0-architecture-analysis-how-to-support-diversified-scenarios-based-on-cloud-native-architecture_600564
[5] https://cloud.tencent.com/developer/article/2277381
[6] https://www.cnblogs.com/hzzjj/p/16552514.html
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
立聪堂德州十三局店
论坛元老
这个人很懒什么都没写!
楼主热帖
零信任介绍
哈夫曼应用
WPF开发随笔收录-获取软件当前目录的坑 ...
《微信小程序-基础篇》什么是组件化以 ...
【iOS逆向与安全】frida-trace入门 ...
VMware虚拟机安装Linux教程(超详细) ...
2021年7月整理--简单方法 暴力破解WIFI ...
sqlserver字符串拼接
django使用多个数据库实现
计算机等级考试二级C语言上机题集(第1 ...
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
边缘计算
MES
物联网
DevOps与敏捷开发
快速回复
返回顶部
返回列表