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

深入浅出消息队列----【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.rhkb.cn/news/408461.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ssrf攻击fastcgi复现

文章目录 环境搭建使用网页查看开始攻击 环境搭建 在/usr/local/nginx/html下新建一个php文件 phpinfo.php 1.php <?php highlight_file(__FILE__); $url $_GET[url]; $curl curl_init($url); curl_setopt($curl, CURLOPT_HEADER, 0); $responseText curl_exec($curl)…

Neo4J下载安装

Windows 版本 1、 下载链接安装JDK 下载链接 https://download.oracle.com/java/22/latest/jdk-22_windows-x64_bin.msi 下载完毕后默认安装即可 2、 下载Neo4J 进入Neo4j Deployment Center - Graph Database & Analytics下载页面&#xff0c;选择社区版&#xff0c;…

QT Quick QML 实例之定制 TableView

QT Quick QML 实例之定制 TableView 一、演示二、C关键步骤1. beginInsertRows()&#xff08;用户插入行&#xff09;2. roleNames() &#xff08;表格中列映射&#xff09;3. data() &#xff08;用户获取数据&#xff09;4. headerData() &#xff08;表头&#xff09;5. fla…

依靠 VPN 生存——探索 VPN 后利用技术

执行摘要 在这篇博文中,Akamai 研究人员强调了被忽视的 VPN 后利用威胁;也就是说,我们讨论了威胁行为者在入侵 VPN 服务器后可以用来进一步升级入侵的技术。 我们的发现包括影响 Ivanti Connect Secure 和 FortiGate VPN 的几个漏洞。 除了漏洞之外,我们还详细介绍了一组…

ETAS工具链自动化实战指南<二>

----自动化不仅是一种技术&#xff0c;更是一种思维方式&#xff0c;它将帮助我们在快节奏的工作环境中保持领先&#xff01; 目录 往期推荐 RTA-A2L工具概览 RTA-A2L的输出文件 常用命令行参数 场景1&#xff1a;通过 MCSD 文件来生成 .a2l 文件并更新地址 命令用法 命…

比Maven快2~10倍的编译工具mvnd简介与实战

概述 maven-mvnd&#xff0c;可简称&#xff08;或缩写&#xff09;mvnd&#xff0c;the Maven Daemon。Apache Maven团队借鉴Gradle和Takari后开发的更快的构建工具。mvnd内嵌Maven&#xff0c;开发者可无缝从Maven迁移到mvnd。 参考资料&#xff1a;GitHub。 mvnd中会启动…

【数据结构篇】~二叉树(堆)

【数据结构篇】~二叉树&#xff08;堆&#xff09; 二叉树1.树2.树的组成3.二叉树4.堆1.向上调整算法2.向下调整算法3.堆排序 4.topk问题源码 二叉树 1.树 树的概念与结构​ 树是一种非线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成一个…

BUG——GT911上电后中断一直触发

版型&#xff1a;正点原子 I.MX6UL MINI板 屏幕&#xff1a;7寸 1024*600 ATK-MD0700R V1.4 我的建议是买7寸屏幕就不要Mini板&#xff0c;因为Mini板太小装不下7寸屏幕&#xff0c;你需要一个更大的板子 简介&#xff1a; 算是作为一个后来者对这一现象的补充。解决方案就…

linux memory cgroup的memory.move_charge_at_immigrate含义

1.内核文档 上面的例子说明&#xff1a; 最开始某个进程是在cgroup A中&#xff0c;后面要迁移到cgroup B中&#xff0c;那么进程的内存计数是否要完全迁入B中&#xff0c;就是通过memory.move_charge_at_immigrate控制&#xff0c;如果目标cgroup也就是B设置了1到该字段中&am…

DBeaver安装使用

文章目录 简介支持的数据库支持的系统 下载安装DBeaver使用修改Maven下载jar地址窗口->首选项连接->驱动->Maven配置仓库地址 选择需要连接的数据库进行连接 简介 DBeaver 是一个通用的数据库管理工具和 SQL 客户端&#xff0c;支持 MySQL, PostgreSQL, Oracle, DB2,…

进存销系统

摘 要 伴随着我国全面推动信息化的趋势&#xff0c;我国的很多行业都在朝着互联网的方向进发。商品销售行业也有很多挑战。这次论文介绍的进存销系统就是为了能够解决当前传统商品进存销存在的问题&#xff0c;使得商品进存销能够更加有效率。电商智能化管理必不可少的帮手有进…

【VIsion Master】机器视觉软件二次开发(C#版本)学习笔记

0.前言 最近接手新项目&#xff0c;用海康威视旗下的HIK ROBOT Vision Master机器视觉软件做二次开发相关的项目&#xff0c;写一篇博客记录一下学习过程。 参考视频&#xff1a;https://www.bilibili.com/video/BV1tq4y1j7RP?p1 其他参考资料&#xff1a;软件自带的开发文档…

学习2d直线拟合-2

参考文章 直线拟合算法&#xff08;续&#xff1a;加权最小二乘&#xff09;_加权拟合直线法-CSDN博客 对比了参考文中和opencv中的直线拟合权重&#xff0c;不知道理解的对不对&#xff0c;前者是权重平方&#xff0c;后者没有平方 QtWidgetsApplication1::QtWidgetsApplic…

Excel中的“块”操作

在Excel中&#xff0c;有offset、index、indirect三个对“区域”操作的函数&#xff0c;是较高版本Excel中“块”操作的利器。 (笔记模板由python脚本于2024年08月20日 19:25:21创建&#xff0c;本篇笔记适合喜欢用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Pytho…

幅频特性曲线分析及使用WPF绘制

文章目录 1、一阶惯性环节的幅频特性曲线分析及绘制2、二阶系统的幅频特性曲线分析及绘制3、一般的系统4、上位机代码实现4.1 一阶惯性系统4.2 二阶系统 5、稳定裕度5.1 幅值裕度5.2 相角裕度 参考 1、一阶惯性环节的幅频特性曲线分析及绘制 这里的a和b可以根据系统的不同修改,…

网络udp及ipc内存共享

大字符串找小字符串 调试 1. 信号处理函数注册&#xff1a;•一旦使用 signal 函数注册了信号处理函数&#xff0c;该函数就会一直有效&#xff0c;直到程序结束或者显式地取消注册。2. 注册多次的影响&#xff1a;•如果多次注册同一信号的处理函数&#xff0c;最后一次注册的…

【记录】基于Windows系统安装rust环境的过程

到官网下载安装包【入门 - Rust 程序设计语言 (rust-lang.org)】 ![[Pasted image 20240703142911.png]] 选择1&#xff0c;快速安装 选择编译配置&#xff0c;1为标准 安装完成 验证是否安装完毕 rustc --versioncargo --version验证成功&#xff01;

UneMeta创始人讲述自己在Web3+IP领域创业的心路历程

昨日&#xff0c;UneMeta创始人&#xff0c;Ann_tyrion在X分享了一篇推文&#xff0c;分享了自己在探索Web3与IP产业结合过程中的心路历程&#xff0c;她并没有像很多项目方那样一味的讲述宏大的叙事&#xff0c;而是字里行间透露出对这个行业的探索和不断给自己充实信念&#…

自动操作一键数据恢复/电子取证

对磁盘模拟扫描修复丢失数据的实验。 先挂载题目磁盘VHD。 Windows系统中打开磁盘管理&#xff0c;-操作&#xff0c;-附加VHD 可以看到已经加载出题目磁盘&#xff0c;接下来打开RStudio数据恢复软件&#xff0c;对其进行扫描。 操作找回丢失/被删除的数据 可以看到已经加载出…

DRF——pagination分页模块

文章目录 分页继承APIView类用法1.PageNumberPagination2.LimitOffsetPagination3.CursorPagination 继承GenericAPIView派生类用法1.PageNumberPagination2.LimitOffsetPagination3.CursorPagination 分页 在查看数据列表的API中&#xff0c;如果 数据量 比较大&#xff0c;肯…