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年4月(17)
 - 2025年3月(25)
 - 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月(11)
 - 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
 

发表评论: