第4章 分布式消息队列的协调者

对于一个消息队列集群来说,系统由很多台机器组成,每个机器的角色、IP 地址都不相同,而且这些信息是变动的。这种情况下, 如果一个新的Producer 或Consumer 加入,怎么配置连接信息呢?NameServer 的存在主要是为了解决这类问题,由NameServer 维护这些配置信息、状态信息,其他角色都通过NameServer 来协同执行。

4.1 NameServer 的功能

NameServer 是整个消息队列中的状态服务器,集群的各个组件通过它来了解全局的信息。同时,各个角色的机器都要定期向NameServer 上报自己的状态,超时不上报的话, NameServer 会认为某个机器出故障不可用了,其他的组件会把这个机器从可用列表里移除。
NamServer 可以部署多个,相互之间独立,其他角色同时向多个NameServer机器上报状态信息,从而达到热备份的目的。NameServer 本身是无状态的,也就是说NameServer 中的Broker 、Topic 等状态信息不会持久存储,都是由各个角色定时上报并存储到内存中的( NameServer 支持配置参数的持久化,一般用不到) 。

4.1.1 集群状态的存储结构

在org.apache.rocketmq.namesrv.routeinfo 的Rou telnfoManager 类中,有五个变量,集群的状态就保存在这五个变量中。

4.1.2 状态维护逻辑

本节基于源码分析NameServer 如何维护各个Broker 的实时状态,如何根据Broker 的情况更新各种集群的属性数据。因为其他角色会主动向Name Server 上报状态,所以NameServer 的主要逻辑在DefaultRequest Processor类中,根据上报消息里的请求码做相应的处理, 更新存储的对应信息。
当NameServer 和Broker 的长连接断掉以后, onChannelDestroy 函数会被调用,把这个Broker 的信息清理出去。
NameServer 还有定时检查时间戳的逻辑, Broker 向NameServer发送的心跳会更新时间戳, 当NameServer 检查到时间戳长时间没有更新后,便会触发清理逻辑。从代码可以看出是每10 秒检查一次,时间戳超过2 分钟则认为Broker 已失效。

4.2 各个角色间的交互流程

下面从Topic 的创建入手,结合源码分析一下NameServer 如何和其他各个组件交互,以及NameServer 存储的元数据内容的具体含义。

4.2.1 交互流程源码分析

这里是一堆代码,不贴出了,说下大概意思。
Topic的创建需要指定b和c两个参数,而且他们俩只有一个会起作用( -b 优先), b 参数指定在哪个Broker 上创建本Topic 的Message Queue , c 参数表示在这个Cluster 下面所有的Master Broker 上创建这个Topic 的Message Queue , 从而达到高可用性的目的。具体的创建动作是通过发送命令触发的。
在Nameserv执行创建Topic的命令后,命令会被发送到对应的Broker上,Broker 接到创建Topic 的请求后,执行具体的创建逻辑。其中最后一步是向NameServer 发送注册信息, NameServer 完成创建Topic 的逻辑后,其他客户端才能发现新增的Topic。

4.2.2 为何不用ZooKeeper

ZooKeeper 是Apache 的一个开源软件,为分布式应用程序提供协调服务。那为什么RocketMQ 要自己造轮子,开发集群的管理程序呢?答案是ZooKeeper 的功能很强大,包括自动Master选举等, RocketMQ 的架构设计决定了它不需要进行Master 选举,用不到这些复杂的功能,只需要一个轻量级的元数据服务器就足够了。

中间件对稳定性要求很高, RocketMQ 的NameServer 只有很少的代码,容易维护,所以不需要再依赖另一个中间件,从而减少整体维护成本。

4.3 底层通信机制

分布式系统各个角色间的通信效率很关键,通信效率的高低直接影响系统性能,基于Socket 实现一个高效的TCP 通信协议是很有挑战的,本节介绍RocketMQ 是如何解决这个问题的。
好吧,这里基本都是代码,不介绍了。

4.4 本章小结

本章介绍了NameServer 的功能, NameServer 在RocketMQ 集群中扮演调度中心的角色。各个Producer 、Consumer 上报自己的状态上去,同时从Name Server 获取其他角色的状态信息。NameServer 的功能虽然非常重要,但是被设计得很轻量级,代码量少并且几乎无磁盘存储,所有的功能都通过内存高效完成。本章还介绍了底层的通信机制, RocketMQ 基于Netty 对底层通信做了很好的抽象,使得通信功能逻辑清晰,代码简单。Netty 的介绍和具体的通信实现可以查看第13 章。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容