rocketmq原理介绍
2025-2-19 diaba
1. 架构组件
-
NameServer:负责管理集群的元数据,如 Broker 的注册信息、Topic 的路由信息等。生产者和消费者通过 NameServer 获取路由信息。
-
Broker:负责消息的存储和管理。Broker 分为 Master 和 Slave,支持高可用部署。
-
生产者(Producer):负责发送消息到 Broker。
-
消费者(Consumer):负责从 Broker 拉取消息并进行消费。
2. 消息生产过程
-
消息发送流程:
-
生产者通过 NameServer 获取 Topic 的路由信息,确定消息应该发送到哪个 MessageQueue。
-
MessageQueue 是 Topic 的数据分片,每个 Topic 的数据会分散到多个 Broker 上,通过 MessageQueue 实现分布式存储。
-
生产者将消息均匀发送到各个 MessageQueue,分散写入请求压力。
-
-
消息持久化:
-
Broker 接收到消息后,会将消息顺序写入到 CommitLog 文件中。
-
CommitLog 文件采用顺序写入的方式,结合操作系统的 PageCache 和异步刷盘机制,实现高性能的磁盘存储。
-
3. 消息存储机制
-
CommitLog:存储所有消息的原始数据,支持顺序写入。
-
ConsumeQueue:存储消息在 CommitLog 中的偏移量(offset),用于快速定位消息。
-
消息存储优化:通过内存映射(mmap)和 PageCache 技术,减少数据拷贝次数,提升读写性能。
4. 高可用机制
-
主从同步:基于 DLedger 技术,Broker 集群通过 Raft 协议实现 Leader 选举和数据同步。
-
故障切换:当 Leader Broker 故障时,Follower Broker 会通过 DLedger 重新选举新的 Leader。
5. 消息消费过程
-
消费者组:消费者以组的形式消费消息,每个 MessageQueue 只能被一个消费者处理。
-
消费模式:
-
Pull 模式:消费者主动从 Broker 拉取消息。
-
Push 模式:基于 Pull 模式实现,Broker 在有新消息时主动唤醒消费者。
-
-
消费进度管理:消费者通过提交消费进度(offset)来记录已处理的消息。
6. 网络通信机制
-
RocketMQ 使用 Netty 框架实现高性能的网络通信。
-
采用 Reactor 线程池监听连接请求,Worker 线程池进行预处理,业务线程池处理具体业务逻辑。
-
多线程并发处理请求,确保高并发和高吞吐。
7. 性能优化
-
顺序写入:CommitLog 文件采用顺序写入,减少磁盘寻道时间。
-
内存映射(mmap):通过 mmap 和 PageCache 技术,减少数据拷贝次数,提升读写性能。
-
异步刷盘:消息先写入 PageCache,由操作系统异步刷盘,提升写入性能。
总结
日历
个人资料

diaba 寻求合作请留言或联系mail: services@jiucaiyuan.net
链接
最新文章
存档
- 2025年3月(13)
- 2025年2月(20)
- 2025年1月(2)
- 2024年10月(1)
- 2024年8月(2)
- 2024年6月(4)
- 2024年5月(1)
- 2023年7月(1)
- 2022年10月(1)
- 2022年8月(1)
- 2022年6月(11)
- 2022年5月(6)
- 2022年4月(33)
- 2022年3月(26)
- 2021年3月(1)
- 2020年9月(2)
- 2018年8月(1)
- 2018年3月(1)
- 2017年3月(3)
- 2017年2月(6)
- 2016年12月(3)
- 2016年11月(2)
- 2016年10月(1)
- 2016年9月(3)
- 2016年8月(4)
- 2016年7月(3)
- 2016年6月(4)
- 2016年5月(7)
- 2016年4月(9)
- 2016年3月(4)
- 2016年2月(5)
- 2016年1月(17)
- 2015年12月(15)
- 2015年11月(12)
- 2015年10月(6)
- 2015年9月(11)
- 2015年8月(8)
分类
热门文章
- SpringMVC:Null ModelAndView returned to DispatcherServlet with name 'applicationContext': assuming HandlerAdapter completed request handling
- Mac-删除卸载GlobalProtect
- java.lang.SecurityException: JCE cannot authenticate the provider BC
- MyBatis-Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}
- Idea之支持lombok编译
标签
最新评论
- logisqykyk
Javassist分析、编辑和创建jav... - xxedgtb
Redis—常见参数配置 - 韭菜园 ... - wdgpjxydo
SpringMVC:Null Model... - rllzzwocp
Mysql存储引擎MyISAM和Inno... - dpkgmbfjh
SpringMVC:Null Model... - tzklbzpj
SpringMVC:Null Model... - bqwrhszmo
MyBatis-Improper inl... - 乐谱吧
good非常好 - diaba
@diaba:应该说是“时间的度量依据”... - diaba
如果速度增加接近光速、等于光速、甚至大于...
最新微语
- 在每件事情上花费的东西,就是生命的一部分,而我们花费的这些东西要求立即得到回报,或者在一个长时间以后得到回报。
2025-01-23 15:46
- 诺曼·文森特说:“并不是你认为自己是什么样的人,你就是什么样的人。但是你的思想是什么样,你就是什么样的人。”
2025-01-23 15:44
- 从今天起,做一个幸福的人。喂马,砍柴,(思想)周游世界
2022-03-21 23:31
- 2022.03.02 23:37:59
2022-03-02 23:38
- 几近崩溃后,找到解决方法,总是那么豁然开朗!所以遇到问题要坚持!
2018-07-18 10:49
发表评论: