RocketMQ源码学习(一)-概述
为什么选择读RocketMQ?
对MQ的理解一直不深,上周看了<Java消息服务>,还是觉得不够深入,找个成熟的产品来学习吧,RabbitMQ是erLang写的,Kafka是Scala写的,非Java写的看起来还需要补充很多知识,ActiveMQ虽然是Java,但是各方面略显老旧,最终选择了RocketMQ(4.1.0-incubating release)来学习.
吐槽下RocketMQ
作为阿里巴巴捐给Apache的项目,官网上有用的资源太少了,到处都只说性能的数据,还有简单例子,详细的使用文档竟然没有了,怪不得没有kafka流行呢,dubbo的文档都比这强很多,话说开源产品不是摆来看和吹牛的,让更多的人方便使用起来才是开源的核心思想吧,另外源码中的注释也实在太少了,还不如我司的项目的注释齐全呢,跟JDK,Spring比起来差太多了,不过好在名字起的不错,编码也规范,看起来还能继续下去.
概览
如图所示RocketMQ的使用由命名服务,生产者,消费者,中转服务器组成.
Name Server 是一个几乎无状态节点,可集群部署,节点之间无任何信息同步
Broker 部署相对复杂,Broker 分为 Master 与 Slave,一个 Master 可以对应多个 Slave,但是一个 Slave 只能对应一个 Master,Master 与 Slave 的对应关系通过指定相同的 BrokerName,不同的 BrokerId 来定义,BrokerId为 0 表示 Master,非 0 表示 Slave。Master 也可以部署多个。每个 Broker 与 Name Server 集群中的所有节点建立长连接,定时注册 Topic 信息到所有 Name Server。
Producer 与 Name Server 集群中的其中一个节点(随机选择)建立长连接,定期从 Name Server 取 Topic 路由信息,并向提供 Topic 服务的 Master 建立长连接,且定时向 Master 发送心跳。Producer 完全无状态,可
集群部署。Consumer 与 Name Server 集群中的其中一个节点(随机选择)建立长连接,定期从 Name Server 取 Topic 路
由信息,并向提供 Topic 服务的 Master、Slave 建立长连接,且定时向 Master、Slave 发送心跳。Consumer 既可以从 Master 订阅消息,也可以从 Slave 订阅消息,订阅规则由 Broker 配置决定。
本系列源码解析主要参照<RocketMQ 原理简介>来追寻其代码实现,虽然版本不太一致,但这也是能找到的最详细的资料了.接下来根据其模块来源码阅读
目录如下:
1. Name Server
2. Producer
3. Broker
4. Consumer