RocketMQ - 消息中间件路由中心的架构原理

1. NameServer到底可以部署几台机器

要部署RocketMQ,就得先部署NameServer,那么NameServer到底可以部署几台机器呢?是一台机器还是可以部署多台机器,如果部署多台机器,他们之间是怎么协同工作的?

NameServer是支持部署多台机器的,也就是可以集群化部署,最主要的原因就是为了高可用性。因为NameServer是集群里面非常关键的一个角色,他要管理Broker的信息,别人都要通过他才知道要跟哪个Broker通信,所以没了他就会很麻烦。

那么如果NameServer就部署一台机器,一旦NameServer宕机了,就会导致整个RocketMQ集群出现故障;所以通常来说,NameServer一定会多机器部署,实现一个集群,起到高可用的效果,保证任何一台机器宕机,其他机器上的NameServer可以继续对外提供服务。

2. Broker是把自己的信息注册到哪个NameServer上?

有人可能会猜测,是不是这样,比如一共有10台Broker机器,2个NameServer机器,然后其中5台Broker会把自己的信息注册到1个NameServer上,另外5台Broker把自己的信息注册到另外一个NameServer上去?

答案是不对的,这样搞有一个最大的问题,如果1台NameServer上有5个Broker的信息,另外一个NameServer上有另外5个Broker的信息,那么此时任何一个NameServer宕机了,不就导致5个Broker的信息就没了吗?

所以说这种做法是不靠谱的,会导致数据丢失,系统不可用。

因此正确的答案是每个Broker启动的时候,都得向所有NameServer进行注册。也就是说每个NameServer都会有一份集群中所有Broker的信息。

3. 系统如何从NameServer获取Broker信息?

生产者和消费者需要知道集群里有哪些Broker,才能根据一定的算法挑选一个Broker去发送消息或者获取消息;有两种办法,第一种是NameServer会主动发送请求给所有的系统,告诉他们Broker信息,但是这种方法明显不靠谱,因为NameServer怎么知道要推送Broker信息给哪些系统呢?

第二种办法就是每个系统自己每隔一段时间,定时发送请求到NameServer去拉取最新的进群Broker信息;这个办法是靠谱的,没有什么明显的缺陷,所以RocketMQ中的生产者和消费者就是这样,自己主动去NameServer拉取Broker信息。
在这里插入图片描述
上图中的路由信息,大致可以理解为集群里的Broker信息以及其他相关的数据信息。

通过这些路由信息,每个系统就知道发送消息或者获取消息到哪台Broker上去进行了,这起到一个把消息路由到一个Broker上的效果,所以一般把这种信息叫做路由信息。

4. 如果Broker挂了,NameServer是怎么感知到的?

Broker启动之后会向NameServer注册自己的信息,每个NameServer都知道集群里有这么一台Broker的存在,然后各个系统从NameServer中也拉取到了Broker的信息,也知道集群里有这么一台Broker。

但是如果这个Broker宕机了呢?

要解决这个问题,靠的是Broker跟NameServer之间的心跳机制,Broker会每隔30秒给所有NameServer发送心跳,告诉每个NameServer自己还活着。

每次NameServer收到一个Broker得到心跳,就更新一下他最近一次心跳的时间。然后NameServer会每隔10秒运行一个任务,去检查一下各个Broker最近一次心跳时间,如果哪个Broker超过120秒都没发送心跳了,那么就认为这个Broker已经挂掉了。

5. 如果Broker挂了,系统是怎么感知到的?

如果Broker挂了,作为生产者和消费者的系统是怎么感知到的呢?难道必须得NameServer发送请求给所有系统通知他们吗?

这个是不现实的,之前已经说过了,NameServer去发送这个东西是非常不靠谱的。

但是如果NameServer没有及时的通知给那些系统,那么就会出现这样一种情况,刚开始集群里有10个Broker,各个系统从NameServer那里得知,都以为有10个Broker。

结果此时突然有一个Broker挂了,120s没有发送心跳给NameServer,NameServer是知道现在只有9个Broker了,但是此时其他系统是不知道只有9个Broker的,还以为有10个Broker,此时可能某个系统就会发送消息到那个已经挂掉的Broker上去,此时是绝对不可能成功发送消息的。
在这里插入图片描述
针对这种情况要怎么办?其实有两种办法解决

首先,可以考虑不发送消息到那台Broker,改成发送到其它Broker上去。

其次,假设必须要发送消息给那台Broker,那么他挂了,他的Slave机器是一个备份,可以继续使用,是不是可以考虑等一会儿去跟他的Slave进行通信?

这些都是思路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/411242.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

备战蓝桥杯————递归反转单链表

当要求只反转单链表中的一部分时,递归实现确实具有一定的挑战性,但也是可行的。下面我将介绍一种递归实现的方法来反转单链表中的一部分。 一、反转链表 题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示…

Mac 下 Python+Selenium 自动上传西瓜视频

背景 研究下 PythonSelenium 自动化测试框架,简单实现 Mac 下自动化批量上传视频西瓜视频并发布,分享给需要的同学(未做过多的异常处理)。 脚本实现 首先通过手工手机号登录,保存西瓜视频网站的 cookie 文件 之后加载…

基于java在线调查表单系统

基于java在线调查表单系统 一、演示效果二、特性汇总三、下载链接 一、演示效果 二、特性汇总 多种技术方案,满足不同的技术选型需求完善的浏览器兼容、保证传统客户也能正常使用部署简单,一行命令完成部署更新方便,直接替换原安装文件不用担…

通过二叉树例题深入理解递归问题

目录 引入: 例1:二叉树的前序遍历: 例2: N叉树的前序遍历: 例3:二叉树的最大深度: 例4:二叉树的最小深度 例5:N叉树的最大深度: 例6:左叶子…

基于Springboot的旅游网管理系统设计与实现(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的旅游网管理系统设计与实现(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层…

ui设计:利用即使设计设计出漂亮样式

目录 一、基本操作 二、具体介绍 6-1 填充图片 6-2 填充色 6-3 图标 右边栏基础设置 右边栏导出​编辑 一、基本操作 二、具体介绍 6-1 填充图片 选择其一图片填充 6-2 填充色 6-3 图标 右边栏基础设置 右边栏导出

C++17之折叠表达式

相关文章系列 深入理解可变参数(va_list、std::initializer_list和可变参数模版) 目录 1.介绍 2.应用 2.1.使用折叠表达式 2.2.支持的运算符 2.3.使用折叠处理类型 3.总结 1.介绍 折叠表达式是C17新引进的语法特性。使用折叠表达式可以简化对C11中引入的参数包的处理&…

自定义el-upload 上传文件

前言 最近在做一个文件上传的功能&#xff0c;后端接口写好了、发现前端上传文件的页面不会写……&#xff08;我很笨的&#xff09;然后我就找啊找发现element有个组件是<el-upload/>能直接上传文件。我就想直接用拿来改改改成自己想要的&#xff0c;可是就是这样我花了…

【C++】拷贝构造函数(深拷贝和浅拷贝)

使用场景 在C类中&#xff0c;我们在类的成员变量内定义了一个指针。这时我们需要去创建它的拷贝构造函数&#xff0c;否则编译器会为这个类创建默认的拷贝构造函数&#xff0c;而默认拷贝构造函数会导致浅拷贝问题&#xff1b;浅拷贝可能会会导致内存泄漏问题&#xff0c;也可…

MATLAB Function转C代码实战

文章目录 前言1. 准备工作2. 使用MATLAB Coder2.1 确定输入输出的类型2.2 MATLAB Coder过程 3. 代码调整和优化4. 编译和测试5. 性能分析和优化结语 前言 在科学与工程领域&#xff0c;MATLAB&#xff08;Matrix Laboratory&#xff09;是一种广泛使用的高级技术计算软件&…

一个Post请求入门NestJS的路由与控制器

​ NestJS的控制器 控制器负责处理传入请求并向客户端返回响应。 控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。 通常&#xff0c;每个控制器都有不止一条路由&#xff0c;不同的路由可以执行不同的操作。 在使用了脚手架的项目中&#xff0c;我…

【激光SLAM】基于图优化的激光SLAM 方法(Grid-based)

文章目录 Graph-based SLAM数学概念 非线性最小二乘(Non-Linear Least Square)解决的问题误差函数线性化流程 非线性最小二乘在SLAM中的应用图的构建&#xff08;SLAM前端&#xff09;误差函数误差函数的线性化固定坐标系构建线性系统求解 Cartographer介绍 Graph-based SLAM …

如何在本地部署密码管理软件bitwarden并结合cpolar实现远程同步

文章目录 1. 拉取Bitwarden镜像2. 运行Bitwarden镜像3. 本地访问4. 群晖安装Cpolar5. 配置公网地址6. 公网访问Bitwarden7. 固定公网地址8. 浏览器密码托管设置 Bitwarden是一个密码管理器应用程序&#xff0c;适用于在多个设备和浏览器之间同步密码。自建密码管理软件bitwarde…

上门服务系统|上门服务小程序|上门服务软件开发

随着移动互联网技术的普及&#xff0c;上门服务小程序系统成为现代企业数字化转型的关键一环。这一系统为消费者提供了更加便捷、高效以及个性化的服务体验&#xff0c;同时也为企业带来了更广阔的商业机会。让我们来看看上门服务小程序系统的优势和功能。 首先&#xff0c;上门…

数据安全治理实践路线(下)

数据安全运营阶段通过不断适配业务环境和风险管理需求&#xff0c;持续优化安全策略措施&#xff0c;强化整个数据安全治理体系的有效运转。 数据安全运营 1. 风险防范 数据安全治理的目标之一是降低数据安全风险&#xff0c;因此建立有效的风险防范手段&#xff0c;对于预防…

使用Docker部署MinIO并结合内网穿透实现远程访问本地数据

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器&#xff0c;可以在各种环境中运行&#xff0c;例如本地、Docker容器、Kubernetes集群等。它兼…

Redis高可用三主三从集群部署

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容使用宝塔面板搭建集群规划配置验证 使用docker搭建使用脚本搭建&#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博…

【JS】事件绑定方法自带一个形参e“function(e)”,what is e?

在学习js的时候 我跳过了一部分章节的内容&#xff0c;导致现在学习react的时候很多内容都不知所措&#xff0c;因为这些教程都是建立在它认为你js所有内容都掌握的前提下&#xff0c;当然这是我自身的原因。需要反省。 下面是正题&#xff1a; 我们知道js有很多事件&#…

Linux设备模型(五) - uevent kernel实现

1. Uevent的功能 Uevent是Kobject的一部分&#xff0c;用于在Kobject状态发生改变时&#xff0c;例如增加、移除等&#xff0c;通知用户空间程序。用户空间程序收到这样的事件后&#xff0c;会做相应的处理。 该机制通常是用来支持热拔插设备的&#xff0c;例如U盘插入后&…

mac flutter 配置

下载Flutter Sdk Start building Flutter Android apps on macOS - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 下载后解压放到一个文件夹 /Users/zhiyu/Documents/gitflutter/flutter3.19.1/ 环境变量中要用到 配置 Android 开发 下载 Android Studio 和应用工具…