前言

上次我们一起了解了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 的架构原理吗?

聊一聊RocketMQ的注册中心NameServer的更多相关文章

  1. RocketMQ 源码分析之路由中心(NameServer)

    你可能没有看过 RocketMQ 的架构图,没关系,一起来学习一下,RocketMQ 架构图如下: 在 RocketMQ 中,有四个角色: Producer:消息的生产者,每个 MQ 中间件都有. C ...

  2. Spring Cloud 系列之 Alibaba Nacos 注册中心(一)

    前言 从本章节开始,我们学习 Spring Cloud Alibaba 相关微服务组件. Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发 ...

  3. Spring Cloud Alibaba系列(一)nacos作为服务注册中心

    Spring Cloud Alibaba各组件版本关系 Spring Cloud Alibaba Version Sentinel Version Nacos Version RocketMQ Ver ...

  4. 学习一下 SpringCloud (六)-- 注册中心与配置中心 Nacos、网关 Gateway

    (1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...

  5. Nacos——注册中心

    目录 1.什么是nacos 2.使用--依赖+配置文件 3.Nacos服务分级存储模型 4.服务跨集群调用问题 5.服务集群属性--配置服务集群 6. Nacos-NacosRule负载均衡 7.根据 ...

  6. dubbo连接zookeeper注册中心因为断网导致线程无限等待问题【转】

    最近维护的系统切换了网络环境,由联通换成了电信网络,因为某些过滤规则导致系统连不上zookeeper服务器(应用系统机器在深圳,网络为电信线路,zookeeper服务器在北京,网络为联通线路),因为我 ...

  7. 基于ZooKeeper的Dubbo注册中心

    SOA服务治理 dubbo_zk 服务总线 感兴趣的M我微信:wonter 微信扫描,人人 CTO 大本营 基于SOA架构的TDD测试驱动开发模式 服务治理要先于SOA 简述我的SOA服务治理 从页面 ...

  8. 安装 Dubbo 注册中心(Zookeeper-3.4.6)--单节点

    1.建议使用dubbo-2.3.3以上版本的使用zookeeper注册中心客户端2.Zookeeper是Apache Hadoop的子项目,强度相对较好,建议生产环境使用该注册中心.3.Dubbo未对 ...

  9. Dubbo Multicast 注册中心即相关代码实现

    Dubbo 的 Multicast注册中心有下面特点: 不需要启动任何中心节点,只要广播地址一样,就可以互相发现 组播受网络结构限制,只适合小规模应用或开发阶段使用. 组播地址段: 224.0.0.0 ...

随机推荐

  1. VulnHub靶场学习_HA: Natraj

    HA: Natraj Vulnhub靶场 下载地址:https://www.vulnhub.com/entry/ha-natraj,489/ 背景: Nataraj is a dancing avat ...

  2. Ubuntu环境下使用Jupyter Notebook查找桌面.csv文档的方法

    这个问题困扰了我很久,最后在一个老师发来的完成结果里找到了答案.(奇怪的是教材里没有.老师也不讲.尤其是百度也没有啊啊啊啊) 好了进入正题.教材里的原话是这样的 这行代码实现的环境应该是在window ...

  3. JavaScript动画实例:炸开的小球

    1.炸开的小球 定义一个小球对象类Ball,它有6个属性:圆心坐标(x,y).小球半径radius.填充颜色color.圆心坐标水平方向的变化量speedX.圆心坐标垂直方向的变化量speedY. B ...

  4. JS 窗口加载与定时器笔记

    bom浏览器对象模型     bom由一系列相关的对象构成并且每个对象都提供了很多方法属性     bom顶级对象是window     bom是浏览器产商在各自浏览器上定义的,兼容性差     wi ...

  5. 朴素贝叶斯算法java实现(多项式模型)

    网上有很多对朴素贝叶斯算法的说明的文章,在对算法实现前,参考了一下几篇文章: NLP系列(2)_用朴素贝叶斯进行文本分类(上) NLP系列(3)_用朴素贝叶斯进行文本分类(下) 带你搞懂朴素贝叶斯分类 ...

  6. 百度小程序中swan.setPageInfo的用法

    现在百度智能小程序是百度最新的流量入口,现在很多做SEO优化.小程序开发的企业为了获取更多的流量不得不开发了,很多的技术人员不了解百度小程序的标题和关键词.描述等信息不知道在哪里设置. 以下是小编给你 ...

  7. C++实现哈夫曼编码/译码器(数据结构)

    设计一个哈夫曼编码.译码系统.对一个ASCII编码的文本文件中的字符进行哈夫曼编码,生成编码文件:反过来,可将编码文件译码还原为一个文本文件.(1) 从文件中读入任意一篇英文短文(文件为ASCII编码 ...

  8. Window C盘 占满原因之一

    最近一段时间,突然C盘 莫名奇妙的满了 ,也没有中毒. 最后查找是因为安装了SQL Reporting  的原因 C:\Program Files\Microsoft SQL Server Repor ...

  9. 震惊!ConcurrentHashMap里面也有死循环,作者留的“彩蛋”?

    JDK BUG 这篇文章,聊一下我最近才知道的一个关于 JDK 8 的 BUG 吧. 首先说一下我是怎么发现这个 BUG 的呢? 大家都知道我对 Dubbo 有一定的关注,前段时间 Dubbo 2.7 ...

  10. python3中文输出乱码的问题

    最近使用you-get这个工具下载视频,发现命令行窗口里显示的媒体标题是乱码(但文件管理器里显示正常).我的命令行窗口的code page是936,sys.stdout.encoding是utf-8, ...