聊一聊RocketMQ的注册中心NameServer
前言
上次我们一起了解了RocketMQ的基本架构原理,那简单的回顾一下RocketMQ的架构组成。
RocketMQ其实包含了四个核心部分,NameServer、Broker、Producer、Consumer。
具体什么含义请参考上一篇文章内容,这里就不再重复介绍了。
NameServer作为RocketMQ的注册中心,它关联着生产者和消费者之间的数据通信,同时又存储着Broker集群的各种部署信息,它十分的重要。
今天我们就从NameServer这个核心部分入手,开始更深入的理解一下RocketMQ的内部原理。
NameServer的部署
要搭建一个RocketMQ技术栈,必然要部署NameServer,那么NameServer是如何部署的呢?
其实上篇文章我们就提到过,NameServer是支持集群化部署的,可以保证高可用性。
我们都知道NameServer作为一个十分重要的核心组成部分,它一旦宕机,整个MQ就无法正常运转了。
所以NameServer是一定要部署多台机器,保证任何时候都能对外提供服务的。
Broker是如何向NameServer注册信息的
下一个问题,Broker是如何向NameServer注册信息的呢?
是不是有人会这么认为?比如我们有10台Broker机器,2个NameServer机器,其中5台互注册到一个NameServer上,另外5台会注册到另外的一个NameServer上,这样一来NameServer中的数据也就实现了分布式存储,有很高的可扩展性。那真实情况是这样吗?
答案是否定的,虽然我们经常接触分布式的理论,MQ也是解决分布式系统中各种问题的关键技术,但不代表所有的情况都适用于分布式存储。
试想一下,如果NameServer分布式存储Broker注册的信息,那生产者从NameServer获取信息时不是又面临着和Broker相同的问题了吗,不知道应该访问哪个NameServer,所以这样的方式是错误的。
RocketMQ的实际方案是,每个Broker都会向每个NameServer进行服务注册。
这样从NameServer获取数据时无论从哪台机器上都能获取到所有的数据,而且就算其中一个NameServer宕机了,其他NameServer也能继续提供服务。
系统是如何从NameServer获取信息的
了解了向NameServer注册信息的方式,那么系统是如何从NameServer中获取信息的呢?
首先我们要知道,系统想要从NameServer里获取到什么信息?
其实主要就获取到两个信息,一是整套的Broker集群列表,二是通过一定的算法选择要访问的Broker机器,可以称其为路由信息。
生产者和消费者自己每隔一段时间,主动去NameServer中拉取这些信息,其实RocketMQ的内部就是这么实现的。
Broker宕机了,NameServer是如何感知到的
在Broker向NameServer注册了自己的信息后,如果这个时候由于各种原因,Broker宕机了,此时如果不去告知NameServer,那么NameServer中的信息就是错误的,当系统获取信息时可能会出现将消息发送到宕机的Broker的情况,导致系统出错,所以NameServer中信息的准确性是很重要的,那么当Broker宕机时,NameServer是真么感知到的呢?
这就要讲到心跳检测了。
就和我们一样,如果心跳停止了,就意味着系统出现了问题,需要治疗了。
Broker会每隔30s向每一个NameServer发送心跳请求,证明自己还活着。而NameServer再接收到心跳请求后,就会记录下这台Broker发送心跳请求的时间。
然后,NameServer自己每10s会扫描一次所有Broker留下的心跳请求时间,如果发现哪台Broker留下来的心跳请求时间距离当前时间超过120s了,那么就会断定这台Broker已经挂掉了,就会更新自己的Broker列表信息。
系统是如果感知到Broker宕机的
刚才我们知道了Broker宕机后,NameServer是可以感知到的,但生产者和消费者系统如果不能感知到宕机的信息,问题还是不能解决的,那么系统是如何感知到Broker宕机的呢?难道只要有Broker宕机了,NameServer就要主动发送消息给各个系统吗?
这是不靠谱的,就算是NameServer主动发送消息给所有系统,也无法解决问题。
我们想一下,如果这时候Broker宕机了,但是同时生产者已经把消息发出来给这台宕机的Broker了,而这个时候NameServer经过心跳检测刚刚感知到这个情况,再去主动发送给这个生产者,这样当然不能解决问题,报错已经发生了。
再想一下,NameServer就算是不主动发送消息给生产者,上边我们已经了解每个系统间隔一段时间就会主动向NameServer拉取信息了,所以NameServer主动发送消息既不能保证实时性,又是一个多此一举的过程。
那么实际解决方案是什么呢?
针对这个问题,以后我们会在专门研究生产者的时候做更详细的讲解,欢迎小伙伴们持续关注H.U.C-王子的文章,带你更深入的走进消息中间件。
往期文章推荐:

聊一聊RocketMQ的注册中心NameServer的更多相关文章
- RocketMQ 源码分析之路由中心(NameServer)
你可能没有看过 RocketMQ 的架构图,没关系,一起来学习一下,RocketMQ 架构图如下: 在 RocketMQ 中,有四个角色: Producer:消息的生产者,每个 MQ 中间件都有. C ...
- Spring Cloud 系列之 Alibaba Nacos 注册中心(一)
前言 从本章节开始,我们学习 Spring Cloud Alibaba 相关微服务组件. Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发 ...
- Spring Cloud Alibaba系列(一)nacos作为服务注册中心
Spring Cloud Alibaba各组件版本关系 Spring Cloud Alibaba Version Sentinel Version Nacos Version RocketMQ Ver ...
- 学习一下 SpringCloud (六)-- 注册中心与配置中心 Nacos、网关 Gateway
(1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...
- Nacos——注册中心
目录 1.什么是nacos 2.使用--依赖+配置文件 3.Nacos服务分级存储模型 4.服务跨集群调用问题 5.服务集群属性--配置服务集群 6. Nacos-NacosRule负载均衡 7.根据 ...
- dubbo连接zookeeper注册中心因为断网导致线程无限等待问题【转】
最近维护的系统切换了网络环境,由联通换成了电信网络,因为某些过滤规则导致系统连不上zookeeper服务器(应用系统机器在深圳,网络为电信线路,zookeeper服务器在北京,网络为联通线路),因为我 ...
- 基于ZooKeeper的Dubbo注册中心
SOA服务治理 dubbo_zk 服务总线 感兴趣的M我微信:wonter 微信扫描,人人 CTO 大本营 基于SOA架构的TDD测试驱动开发模式 服务治理要先于SOA 简述我的SOA服务治理 从页面 ...
- 安装 Dubbo 注册中心(Zookeeper-3.4.6)--单节点
1.建议使用dubbo-2.3.3以上版本的使用zookeeper注册中心客户端2.Zookeeper是Apache Hadoop的子项目,强度相对较好,建议生产环境使用该注册中心.3.Dubbo未对 ...
- Dubbo Multicast 注册中心即相关代码实现
Dubbo 的 Multicast注册中心有下面特点: 不需要启动任何中心节点,只要广播地址一样,就可以互相发现 组播受网络结构限制,只适合小规模应用或开发阶段使用. 组播地址段: 224.0.0.0 ...
随机推荐
- VulnHub靶场学习_HA: Natraj
HA: Natraj Vulnhub靶场 下载地址:https://www.vulnhub.com/entry/ha-natraj,489/ 背景: Nataraj is a dancing avat ...
- Ubuntu环境下使用Jupyter Notebook查找桌面.csv文档的方法
这个问题困扰了我很久,最后在一个老师发来的完成结果里找到了答案.(奇怪的是教材里没有.老师也不讲.尤其是百度也没有啊啊啊啊) 好了进入正题.教材里的原话是这样的 这行代码实现的环境应该是在window ...
- JavaScript动画实例:炸开的小球
1.炸开的小球 定义一个小球对象类Ball,它有6个属性:圆心坐标(x,y).小球半径radius.填充颜色color.圆心坐标水平方向的变化量speedX.圆心坐标垂直方向的变化量speedY. B ...
- JS 窗口加载与定时器笔记
bom浏览器对象模型 bom由一系列相关的对象构成并且每个对象都提供了很多方法属性 bom顶级对象是window bom是浏览器产商在各自浏览器上定义的,兼容性差 wi ...
- 朴素贝叶斯算法java实现(多项式模型)
网上有很多对朴素贝叶斯算法的说明的文章,在对算法实现前,参考了一下几篇文章: NLP系列(2)_用朴素贝叶斯进行文本分类(上) NLP系列(3)_用朴素贝叶斯进行文本分类(下) 带你搞懂朴素贝叶斯分类 ...
- 百度小程序中swan.setPageInfo的用法
现在百度智能小程序是百度最新的流量入口,现在很多做SEO优化.小程序开发的企业为了获取更多的流量不得不开发了,很多的技术人员不了解百度小程序的标题和关键词.描述等信息不知道在哪里设置. 以下是小编给你 ...
- C++实现哈夫曼编码/译码器(数据结构)
设计一个哈夫曼编码.译码系统.对一个ASCII编码的文本文件中的字符进行哈夫曼编码,生成编码文件:反过来,可将编码文件译码还原为一个文本文件.(1) 从文件中读入任意一篇英文短文(文件为ASCII编码 ...
- Window C盘 占满原因之一
最近一段时间,突然C盘 莫名奇妙的满了 ,也没有中毒. 最后查找是因为安装了SQL Reporting 的原因 C:\Program Files\Microsoft SQL Server Repor ...
- 震惊!ConcurrentHashMap里面也有死循环,作者留的“彩蛋”?
JDK BUG 这篇文章,聊一下我最近才知道的一个关于 JDK 8 的 BUG 吧. 首先说一下我是怎么发现这个 BUG 的呢? 大家都知道我对 Dubbo 有一定的关注,前段时间 Dubbo 2.7 ...
- python3中文输出乱码的问题
最近使用you-get这个工具下载视频,发现命令行窗口里显示的媒体标题是乱码(但文件管理器里显示正常).我的命令行窗口的code page是936,sys.stdout.encoding是utf-8, ...