深入浅出消息队列----【Broker 集群】

news2024/11/13 22:07:05

深入浅出消息队列----【Broker 集群】

  • 单 master
  • 多 master
  • 多 master 多 slave 异步复制
  • 多 master 多 slave 同步复制
  • Dledger

本文仅是文章笔记,整理了原文章中重要的知识点、记录了个人的看法
文章来源:编程导航-鱼皮【yes哥深入浅出消息队列专栏】

请添加图片描述

Broker cluster 可以分为五类:

  1. 单 master
  2. 多 master
  3. 多 master 多 slave 异步复制
  4. 多 master 多 slave 同步复制
  5. Dledger

单 master

如果我们仅部署了一个 Broker 实例,那么就是单 master 模式。

假设这个 master 宕机了,那么生产者发送消息会失败、消费者拉取消息也会失败。

请添加图片描述

此时整个消息队列就不可用了,影响了线上服务的正常执行。

基本上生产环境不会采取单 master 模式,这种一般只会在测试时候使用。

多 master

如果仅部署一个实例风险太大,那么部署两个就能避免 Broker 单点的风险。

此时两个 Broker 会互相瓜分对应的 Topic 下的队列,比如 TopicA 一共分了 8 哥队列,那么 Broker-1 承担其中的 4 哥,Broker-2 承担另外四个。

请添加图片描述

这样一来,生产者给不同队列发送消息,写入消息的压力已经均匀的分配到两个 Broker 身上了,提升了写消息的性能。

如果此时 Broker-1 宕机了,咋办呢?

生产者发送给 Broker-1 的消息会失败,但是还记得之前说过的同步、异步发送消息,如果发送失败,生产者会默认重试的机制吗?

没错,生产者会重试发送消息,而且此时会自动避让上次发送失败的 Broker,因此发给 Broker-1 失败后,会避让 Broker-1,会选择投递到 Broker-2,所以 Broker-1 宕机不会影响消息的发送。

但对于消费者而言,如果想消费队列-1到队列-4的消息,只能从 Broker-1 拉取,此时拉取肯定是失败的,因此**会影响宕机钱已经发送存储至 Broker-1 但还未被消费的消息,**这些消息的实时性无法保证,只能等 Broker-1 恢复。

不会影响新消息的消费,因为新的消息只会被发往 Broker-2。

这时候,只要 Broker-1 重启,那么消费者就能顺利地拉取之前在 Broker-1 的消息了(如果消息已经被刷盘了的话)。

什么叫刷盘呢?消息发送成功了,不代表一定已经被 Broker 持久化了

一般为了性能,消息写入到 Broker 后,还在页缓存中,不会同步刷到磁盘内,也就是消息写到页缓存就返回消息写入成功,此时如果断电了,那么在页缓存内的数据就没了,消息也就丢了。

请添加图片描述

如果想消息一定不丢,只能是同步刷盘,也就是每次消息写入都直接刷盘,这样消息是不会丢的,但是这样性能不好,这就要根据实际场景进行取舍了。

请添加图片描述

这里需要提一下,上述对生产者发送消息没有影响指的是普通消息,如果是顺序消息则会有影响。

因为顺序消息的实现是选择 Topic 下的某一队列进行发送,如果 Broker-1 宕机,本来都需要发送给队列-1 的消息,此时发送到队列-6,那么队列-1 的消息会宕机了还未被消费,队列-6 后来到的消息反而被消费了,此时消息的顺序性就无法保证了。

多 master 多 slave 异步复制

上述多 master 的模式,如果发生一个实例宕机会影响部分消息的实时性,因此就弄了哥 slave 来作为 master 的 backup。

请添加图片描述

每个 master 对应有一个 slave,正常情况下 slave 只会默默同步 master 的消息,不支持消息的直接写入,正常也不会对外提供消费。

只有当 master 繁忙(例如当拉取的消息太久远了或因为消息堆积严重,消息不在 master 内存中,就会返回繁忙,此时消费者就会去 slave 拉取消息,前提是 slaveReadEnable 参数要设置为 true),或者 master 挂了才会被消费者消费。

总而言之,当 master 不太行的时候,消费者可以选择对应的 slave 拉取消息,这样就避免了 master 不行后消息的实时性问题。

所以 slave 就是个备胎,当 master 不好了,消费者才会来找 slave。

那何为异步复制呢?

生产者将消息写到 master 后就返回成功了,然后 slave 回去 master 同步消息,也因此 slave 上的消息相对于 master 会有一定的滞后性,所以当 master 宕机,消费者从 slave 拉取消息的时候,可能会存在个别消息丢失的情况。

看到这可能有同学会有疑惑:为啥 slave 不能被生产者主动写入消息呐?

理论上是可以的,master 和 slave 都支持写入,但这需要实现 master 和 slave 之间数据的双向同步,互相同步消息保证消息的一致性,但这样会比较麻烦,会牵扯一些冲突,比如消息的顺序冲突等等。

多 master 多 slave 同步复制

如果想要保证 slave 的消息不丢失,那么可以采取同步复制的情况。

所谓同步复制其指的是生产者只有在消息存储到 master 以及对应的 slave 中后,才会得到消息写入成功的结果,这样就保证 slave 不会落后于 master。

也因此,在同步复制的情况下,当 master 挂了,消费者从 slave 拉取到的事完整的消息。

请添加图片描述

当然,这样消息是可靠了,但是对性能会有一定的损耗,因为本来生产者仅需等消息写到 master 就直接返回了,现在还得多等一下,等 slave 也写完了才能返回。

不过这种模式还是无法解决消息写入的问题,即 master 宕机后,消息写入的压力无法被 slave 分担到。

Dledger

Dledger 集群算是 RocketMQ 集群的终极版本了。

Dledger 集群指的是一组具有相同名称的 Broker,至少有 3 哥节点,它们组成 RocketMQ-on-Dledger Group,这个集群基于 raft 协议(一致性协议),实现自动的主从切换。

当主节点挂了,那么集群内会自动选举出新的主节点。

按照 raft 协议的术语,主节点就是 leader,想要组成这个集群,至少需要三台机子,也就是至少还得有 2 哥 follower,这样根据投票的规则,当 leader 挂了,才能自动从 follower 中选出新的 leader,此时就自动完成了主从切换,使得消息能正常的写入。

之前的集群模式,当 master 挂了之后,slave 还是 slave,无法自动被提升为 master,而 Dledger 则可以自动完成主从切换,非常顺滑。

请添加图片描述

之所以可以自动从 follower 中投票选取出 leader 是因为 Dledger 会接管 commitlog 的存储,通过 raft 协议,follower 会同步 leader 的 commitlog,保证消息的一致性。

可以简单理解集群中的消息存储都是一致性的,不会出现消息顺序不一致等数据冲突等问题,因此当 leader 没了,可以从 follower 中选一个提升为 leader,反正消息都是对的。

这个模式的缺点就是需要多点机器才能实现 Dledger 集群,等于以前是一个 master 配备一共 slave,现在是一个 leader 至少配备两个 follower。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode100.删除链表的倒数第 N 个结点

1. 题目大意 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 进阶:你能尝试使用一趟扫描实现吗? 2. 思路分析 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]我们可以先遍历一遍链表求出…

Data Localization Software Architecture - SAAS Localization CyberWin Future

一、Future Window Industry Application Cross-platform Architecture The cross-platform architecture of Future Window adopts Hybird (hybrid mode mobile application), which is a mobile application development model that combines the characteristics of native …

golang学习笔记——grom连接mysql

GORM 指南 The fantastic ORM library for Golang aims to be developer friendly. Golang的ORM库旨在对开发人员友好。 特性 全功能 ORM关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)Create&…

【Redis】渐进式遍历和数据库管理

渐进式遍历和数据库管理 渐进式遍历scan 数据库管理切换数据库清除数据库 渐进式遍历 Redis 使⽤ scan 命令进⾏渐进式遍历键,进⽽解决直接使⽤ keys 获取键时可能出现的阻塞问题。每次 scan 命令的时间复杂度是 O(1),但是要完整地完成所有键的遍历&…

数学建模笔记(三):拟合算法

前面介绍的插值方法,我们可以发现他的特点在于最终得到的曲线一定要经过已经给出的样本点的,而这次要介绍的拟合方法的区别在于,拟合不要求曲线一定要经过所有的样本点,只要这个曲线与样本点之间的误差足够小,距离足够…

unity AssetBundle 使用_什么是AssetBundle_导入必要的插件_创建AssetBundles_AB包资源下载_大文件下载

一、什么是AssetBundle? 定义AssetBundle。 AssetBundle 是一个存档文件,包含可在运行时由 Unity 加载的特定于平台的非代码资源(比如模型、纹理、预制件、音频剪辑甚至整个场景)。AssetBundle 可以表示彼此之间的依赖关系&…

PD取电快充协议方案

PD快充协议是通过调整电压和电流来提供不同的充电功率。它采用了一种基于USB-C端口的通信协议,实现了充电器于设备之间的信息交换。在充电过程中设备会向充电器发出请求,要求提供不同的电压和电流,充电器接收到请求后,会根据设备的…

数据本地化软件架构-SAAS本地化未来之窗行业应用跨平台架构

一、未来之窗行业应用跨平台架构 未来之窗跨平台架构采用Hybird(混合模式移动应用)是一种结合了原生应用(Native App)和网页应用(Web App)特点的移动应用开发模式。 二、特点 2.1. 开发成本相对较低 - 与…

C++码表之Unicode

今日诗词: 折花逢驿使,寄与陇头人。 江南无所有,聊赠一枝春。 ——《赠范晔诗》【南北朝】陆凯 引言: 上一期我们说到了ASCII码表,这是一种现如今不是那么通用的机制,随着计算机的普及,越来越…

电脑ip地址为什么会自己变更?电脑ip怎么改

在当今这个高度依赖互联网的时代,IP地址作为网络设备的身份标识,其稳定性和可管理性对于网络通信的顺畅至关重要。然而,许多用户可能会遇到电脑IP地址自动变更的情况,这不仅可能影响到网络连接的稳定性,还可能给远程访…

怎么使用win10录屏快捷键 ?分享三款录屏工具

录屏软件在我们日常生活中越来越常见,无论是做教程、记录游戏精彩瞬间还是进行远程教学,一个好的录屏软件都能让我们的生活变得更加便捷。不少人也会选怎win10自带的录屏,使用WIN10 录屏快捷键【winG】,就可以唤出录屏工具&#x…

【Node】【1】node和nvm安装

安装nvm、node、npm 安装node 18 ,最简单的办法是使用nvm,就不用手动安装了,那么就得先安装nvm。 NVM 是Node Version Manager,用于管理 Node.js 版本。你设备上的不同项目可能使用不同版本的 Node.js。通过 nvm,用户…

Redis | 非关系型数据库Redis的初步认识

本节内容相对理论,着重看基础通用命令这一节 Redis 非关 kv型{字典} 概念应用ubuntu安装配置 windows添加密码 可能问题【ubuntu】远程连接 基础通用命令 ⭐ 概念 特点: 1、开源的,使用C编写,基于内存且支持持久化 2、没有表 支持…

ssrf例题分析

我们第一步先在ubuntu中解压web-ssrfme.zip,更新镜像后重启容器。 我们可以看到代码中成功拉取到ssrfme镜像 ig(preg_match(/file\:\/\/|dict\:\/\/.|\.\.\/|127.0.0.1|localhost/is,$url,$match)) 使用端口访问文件&…

【Linux系列】SH 与 BASH 的区别:深入解析与使用案例

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Leetcode JAVA刷刷站(93)复原IP地址

一、题目概述 二、思路方向 为了解决这个问题,我们可以使用回溯算法。回溯算法在这里非常适用,因为我们需要尝试在字符串中的不同位置插入点(.)来分割出可能的IP地址段,并且需要验证每个段是否满足条件(即…

如何使用ssm实现铁岭河医院医患管理系统+vue

TOC ssm077铁岭河医院医患管理系统vue 系统概述 进过系统的分析后,就开始记性系统的设计,系统设计包含总体设计和详细设计。总体设计只是一个大体的设计,经过了总体设计,我们能够划分出系统的一些东西,例如文件、文…

从web.xml动态读取sunspringmvc.xml文件

文章目录 1.问题分析1.SunWebApplicationContext.java 中sunspringmvc.xml是写死的2.但是web.xml已经配置了init-param,所以应该是可以读取的 2.具体实现1.SunDispatcherServlet.java 得到ServletConfig传递给Spring容器完成初始化2.SunWebApplicationContext.java …

C_03 函数学习

函数 优点: 降低代码耦合度降低代码冗余度提高代码复用率提高代码可读性 思想: 封装【包装】 声明: 语法: extern 函数名(形参列表);// 注意:此时 形参列表中变量名可以忽略不写;定义&#xff1…

2024.8.26

一、对于第三模态加入对于模型性能的影响 yes/no other num 尝试通过 1、删去第一次反向传播时第三模态的梯度更新 (1)第三次反向传播会再进行一次更新 (2)阻止模型频繁的学习训练样本 2、取消第三模态共享头部更新时的权重修正&…