前言

上次我们一起了解了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. PV与UV你的网站也可以

    个人博客网站分析 阅读前面的文章,有助于理解本文. 1.是时候来一个个人博客网站了 2.什么?你还没有自己的域名? 3.你的个人博客网站该上线了! 为什么需要流量分析? 各位小伙伴,请看下图,你们发现 ...

  2. Xposed原理分析

    目录 安卓系统启动 什么zygote? 安卓应用运行? Xposed介绍 Xposed构成 Xposed初始化大体工作流程 源码分析 初始化 app_main#main app_main#initia ...

  3. LeetCode 164. Maximum Gap[翻译]

    164. Maximum Gap 164. 最大间隔 Given an unsorted array, find the maximum difference between the successi ...

  4. Json字符串与QVariantList 对象相互转换

    在Qt中QVariantList 使用起来很方便,如果涉及到数据的传输,需要将QVariantList 数据转换为JsonArray字符串,这个转换Qt已经实现好了,只需要调用接口就可以完成转换,代码 ...

  5. The Involution Principle

    目录 Catalan Paths Vandermonde Determinant The Pfaffian Catalan Paths 从 \((0,0)\) 走到 \((n,n)\), 每次只能向上 ...

  6. 远程服务器的管理工具SSH

    1.SSH是什么? SSH:Secure Shell 安全外壳协议 建立在应用层基础上的安全协议 可靠,专为远程登录会话和其他网络服务提供安全性的协议 有效防止远程管理过程中的信息泄露问题 SSH客户 ...

  7. JAVA三种多线程实现方法和应用总结

    最近在做代码优化时学习和研究了下JAVA多线程的使用,看了菜鸟们的见解后做了下总结.1.JAVA多线程实现方式JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用Exe ...

  8. C#设计模式之13-职责链模式

    职责链模式(Chain of Responsibility Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archive ...

  9. Mac开发工具

    便捷管理你的Mac App Homebrew:https://brew.sh/index_zh-cn 强大的文本编辑器 Sublime Text:http://www.sublimetext.com ...

  10. 逃离CSDN -慕舲的黑夜-第三期

    来时,是朋友推荐查资料,后来看到CSDN的UI,好华丽高大上,也读了CSDN首页推荐的一些文章,加入CSDN. 可是后来随着博客园,蓝奏云,w3c菜鸟教程,等平台的出现,CSDN越来越令人心寒