聊一聊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 ...
随机推荐
- windows:驱动模块隐藏
windwos下想要搞点事,权限当然是越大越好:驱动模块天生在0环,和操作提供平级,大家互相是兄弟,所以很多外挂.木马.病毒都会使用驱动达到自己的目的.那么问题来了:PCHUNTER这种工具能查到系统 ...
- 【JSOI2007】文本生成器 题解(AC自动机+动态规划)
题目链接 题目大意:给定$n$个子串,要求构造一个长度为$m$的母串使得至少有一个子串是其子串.问方案数. ------------------------ 我们可以对要求进行转化:求出不合法的方案数 ...
- 对Word2Vec的理解
1. word embedding 在NLP领域,首先要把文字或者语言转化为计算机能处理的形式.一般来说计算机只能处理数值型的数据,所以,在NLP的开始,有一个很重要的工作,就是将文字转化为数字,把这 ...
- CentOS7系统管理与运维实战
CentOS7系统管理与运维实战 下载地址 https://pan.baidu.com/s/1KFHVI-XjGaLMrh39WuhyCw 扫码下面二维码关注公众号回复100007 获取分享码 本书目 ...
- URL中加号(+)转义问题
URL中加号(+)转义问题 前端通过URL传入一个参数,在后台日志中发现参数中的加号变成了空格. 前端传入a+b 后台日志a b 可以看到,+ 变成了空格. 先说结论 HTTP为了避免歧义,一些字符传 ...
- 2020重新出发,JAVA入门,关键字&保留字
关键字 & 保留字 关键字(或者保留字)是对编译器有特殊意义的固定单词,不能在程序中做其他目的使用. 关键字具有专门的意义和用途,和自定义的标识符不同,不能当作一般的标识符来使用.例如, cl ...
- 初识HTML(二)
目录 HTML表格 HTML列表 HTML表格 表格主要显示.展示数据. 表格基本语法:<table>定义一个表格,<tr>定义表格中的一行,<td>定义一行中的某 ...
- C#开发笔记之02-什么时候使用OnXXX方法,这种命名是什么意思?
C#开发笔记概述 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/958 访问. 你也许经常会看到别人写的代码里有OnXX ...
- IDEA 非常重要的一些设置项 → 一连串的问题差点让我重新用回 Eclipse !
开心一刻 建筑行业内,我看过的最凶残笑话(IT行业内好一致!) 上联:一天晚上两个甲方三更半夜四处催图只好周五加班到周六早上七点画好八点传完九点上床睡觉十分痛苦 下联:十点才过九分甲方八个短信七个电话 ...
- LeetCode 392. Is Subsequence 详解
题目详情 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 你可以认为 s 和 t 中仅包含英文小写字母.字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 & ...