互联网全景消息(6)之RocketMq-NameServer源码分析
一、RocketMQ介绍
RocketMQ 是阿里巴巴集团基于高可用分布式集群技术,自主研发的云正式商用的专业消息中间件,既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性,是阿里巴巴双 11 使用的核心产品。
二、RocketMQ版本发展
2011年,Linkin(领英:全球知名的职场社交平台)推出Kafka消息引擎,阿里巴巴中间件团队在研究了Kafka的整体机制和架构设计之后,基于Kafka(Scala语言编写)的设计使用Java进行了完全重写并推出了MetaQ 1.0版本,主要是用于解决顺序消息和海量堆积的问题,由开源社区killme2008维护。具体见:GitHub - killme2008/Metamorphosis: A high available,high performance distributed messaging system. 2012年,阿里巴巴发现MetaQ原本基于Kafka的架构在阿里巴巴如此庞大的体系下很难进行水平扩展,于是对MetaQ进行了架构重组升级,开发出了MetaQ 2.0,同年阿里把Meta2.0从阿里内部开源出来,取名RocketMQ,为了命名上的规范以及版本上的延续,对外称为RocketMQ3.0。因为RocketMQ3只是RocketMQ的一个过渡版本。
2016年11月28日,阿里巴巴宣布将开源分布式消息中间件RocketMQ捐赠给Apache,成为Apache 孵化项目。在孵化期间,RocketMQ完成编码规约、分支模型、持续交付、发布规约等方面的产品规范化,同时RocketMQ3也升级为RocketMQ4。现在RocketMQ主要维护的是4.x的版本,也是大家使用得最多的版本,项目地址:GitHub - apache/rocketmq: Apache RocketMQ is a cloud native messaging and streaming platform, making it simple to build event-driven applications. 2015年,阿里基于RocketMQ开发了阿里云上的Aliware MQ,Aliware MQ(Message Queue)是RocketMQ的商业版本,是阿里云商用的专业消息中间件,是企业级互联网架构的核心产品,基于高可用分布式集群技术,搭建了包括发布订阅、消息轨迹、资源统计、定时(延时)、监控报警等一套完整的消息云服务。因为Aliware MQ是商业版本产品地址:云消息队列 RocketMQ 版_云原生分布式消息中间件_削峰填谷_容器与中间件-阿里云
2.1 RocketMQ4.X版本更新概要
-
在 RocketMQ 4.3.0 版本之后,正式发布事务消息,通过类似于两阶段的方式去解决上下游数据不一致问题。
-
在 RocketMQ 4.4.0 版本中,RocketMQ 增加了消息轨迹的功能,使用户可以更好定位每一条消息的投放接收路径,帮助问题排查,另外还增加 ACL 权限控制,提高了 RocketMQ 的管控能力和安全性。
-
在 4.5.0 版本中,RocketMQ 推出了多副本,也就是 Raft 模式。在 Raft 模式下,一组 Broker 如果 Master 挂了,那么 Broker 中其他 Slave 就会重新选出主。因此 Broker 组内就拥有了自动故障转移的能力,也解决了像高可用顺序消息这样的问题,进一步提高了 RocketMQ 的可用性。
-
在 4.6.0 版本中,我们推出了轻量级 Pull Consumer,用户可以使用更加适合于流计算的 API,这一版本也开始支持全新的 Request-Reply 消息,使得 RocketMQ 具备了同步调用 RPC 的能力,RocketMQ 可以更好的打破网络隔离网络之间的调用,这个版本中 RocketMQ 也开始支持 IPV6,并且是首个支持 IPV6 的消息中间件。
-
在 4.7.0 版本中,RocketMQ 重构了主备同步复制流程,通过线程异步化,将同步复制和刷盘的过程 Pipeline 化,同步双写性能有将近数倍提升。
-
在 4.8.0 版本中,RocketMQ Raft 模式有了一个质的提升,包括通过异步化、批量复制等手段将性能提升了数倍,在稳定性上利用 OpenChaos 完成包括宕机、杀死进程,OOM、各种各样的网络分区和延迟的测试,修复了重要 Bug。在功能上,支持 Preferred Leader,从而 Broker 组内可以优先选主,也支持了批量消息等功能。
-
在 4.9.0 版本,主要是提升了可观测性,包括支持 OpenTracing,事务消息和 Pull Consumer 支持 Trace 等功能。
三、RocketMQ源码分析
3.1 RocketMQ的核心三流程
整体模块如下
- rocketmq-namesrv:命名服务,更新和路由发现 broker服务。NameServer 要作用是为消息生产者、消息消费者提供关于主题 Topic 的路由信息,NameServer除了要存储路由的基础信息,还要能够管理 Broker节点,包括路由注册、路由删除等功能
- rocketmq-broker:mq的核心。 它能接收producer和consumer的请求,并调用store层服务对消息进行处理。HA服务的基本单元,支持同步双写,异步双写等模式。
- rocketmq-store:存储层实现,同时包括了索引服务,高可用HA服务实现。
- rocketmq-remoting:基于netty的底层通信实现,所有服务间的交互都基于此模块。
- rocketmq-common:一些模块间通用的功能类,比如一些配置文件、常量。
- rocketmq-client:java版本的mq客户端实现.
- rocketmq-filter:消息过滤服务,相当于在broker和consumer中间加入了一个filter代理。
- rocketmq-srvutil:解析命令行的工具类ServerUtil。
- rocketmq-tools:mq集群管理工具,提供了消息查询等功能
RocketMQ的源码是非常的多,我们没有必要把RocketMQ所有的源码都读完,所以我们把核心、重点的源码进行解读,RocketMQ核心流程如下:
- 启动流程
RocketMQ服务端由两部分组成NameServer和Broker,NameServer是服务的注册中心,Broker会把自己的地址注册到NameServer,生产者和消费者启动的时候会先从NameServer获取Broker的地址,再去从Broker发送和接受消息。
- 消息生产流程
Producer将消息写入到RocketMQ集群中Broker中具体的Queue。
- 消息消费流程
Comsumer从RocketMQ集群中拉取对应的消息并进行消费确认。
3.2 NameServer整体流程
NameServer是整个RocketMQ的“大脑”,它是RocketMQ的服务注册中心,所以RocketMQ需要先启动NameServer再启动Rocket中的Broker。
原文地址:https://blog.csdn.net/jokeMqc/article/details/142629991
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!