RabbitMQ 队列之战:Classic 和 Quorum 的性能洞察

    RabbitMQ 是一个功能强大且广泛使用的消息代理,它通过处理消息的传输、存储和交付来促进分布式应用程序之间的通信。作为消息代理,RabbitMQ 充当生产者(发送消息的应用程序)和使用者(接收消息的应用程序)之间的中介,即使在复杂的分布式环境中也能确保可靠的消息传递。

    RabbitMQ 的核心组件之一是队列,消息在其中临时存储,直到被使用。队列在 RabbitMQ 的架构中起着关键作用,支持异步通信并将生产者和使用者解耦。这种解耦允许应用程序独立运行,从而提高可扩展性、弹性和容错能力。

    了解 RabbitMQ 中不同类型队列的性能特征对于设计高效的系统架构至关重要。队列决定了消息的路由、存储和使用方式,从而影响吞吐量、延迟和持久性。

了解经典队列

    RabbitMQ 中的经典队列是默认队列类型,旨在实现高吞吐量和简单性。它们遵循先进先出 (FIFO) 模型,其中消息按照接收顺序传送给使用者,从而确保可预测的消息流。Classic 队列广泛用于性能和速度比跨多个节点的容错和消息持久性更重要的场景。

6908b3f6688c1957ab2ad6221ebb481a.png

Classic Queues 的主要功能

  • 单节点存储:Classic 队列存储在单个 RabbitMQ 节点上。消息不会在其他节点之间复制,从而使队列更快,但在节点发生故障时弹性较差。

  • FIFO 消息处理:消息按照其到达的顺序进行存储和使用,从而确保简单的处理模型,尤其是对于消息顺序很重要的任务。

  • 持久和非持久消息:Classic 队列可以将消息存储在内存中(瞬态)或磁盘(持久)中。持久性消息将保存到磁盘,确保在服务器重新启动或崩溃时消息不会丢失,尽管这会带来性能权衡。

  • 高吞吐量:Classic 队列针对速度进行了优化,可以以低延迟处理大量消息。它们最适合消息处理速度至关重要的应用程序,例如实时系统或日志聚合服务。

  • 单节点持久性:虽然 Classic 队列支持消息持久性,但它们缺乏跨节点复制。这意味着,如果托管队列的节点发生故障,持久消息将在节点恢复时继续存在,但没有内置冗余来继续跨其他节点进行操作。

 Classic 队列的使用案例

  • 实时系统:Classic 队列非常适合需要高速消息处理的应用程序,例如游戏系统、流媒体平台或监控工具。

  • 无状态应用程序:不需要消息复制或跨节点高可用性的应用程序受益于 Classic 队列的简单性和性能。

  • 低延迟:对于需要最大限度地减少消息生成和使用之间的延迟的工作负载,经典队列提供低延迟消息传递。

了解 Quorum 队列

    RabbitMQ 中的仲裁队列是一种更新的、高度可用的、具有容错能力的队列类型,专为需要强大的持久性保证和节点故障弹性的系统而设计。Quorum 队列利用 Raft 共识算法跨多个节点复制消息,确保即使在硬件或软件故障的情况下也能保持消息可用性。这使它们非常适合消息丢失或停机不可接受的关键应用程序。

eaa4ac82aefedcce39cc54a7e3c7bcea.png

Quorum 队列的主要功能

  • 领导-追随者复制:仲裁队列使用领导-追随者模型运行。每个 Quorum 队列都有一个负责处理传入消息的领导节点和多个复制领导消息的 follower 节点。此复制可确保数据冗余,只有在大多数节点 (仲裁) 确认复制后才会确认消息。

  • Raft 共识算法:Raft 算法保证了节点之间的一致性。当消息发送到仲裁队列时,它会被复制到关注者,只有在大多数 (仲裁) 关注者确认该消息后,它才会变为 “已提交”。这提供了强大的持久性保证,确保系统可以从故障中恢复而不会丢失数据。

  • 容错能力:Quorum 队列旨在承受节点故障。如果 Leader 节点崩溃,将使用 Raft 协议从从 Follower 中选出一个新的 Leader,从而允许消息处理继续进行,并将中断降至最低。这提供了高可用性,并使仲裁队列在分布式环境中具有弹性。

  • 消息持久性:默认情况下,仲裁队列中的所有消息都是持久性的,这意味着它们将写入磁盘并在多个节点之间复制。这可确保消息不会丢失,即使 RabbitMQ 集群遇到节点故障或重新启动也是如此。

  • 高可用性:Quorum 队列通过确保只要大多数节点正常运行,消息传输和使用就可以继续进行,从而优先考虑可用性。这使它们成为无法容忍停机或数据丢失的任务关键型系统的理想选择。

  • 无单点故障:与 Classic 队列不同,Classic 队列由于驻留在单个节点上而容易受到节点故障的影响,而 Quorum 队列通过在 RabbitMQ 集群中的多个节点之间分发消息来消除单点故障的风险。

仲裁队列的使用案例

  • 金融服务:处理交易、付款或敏感财务数据的系统受益于 quorum 队列提供的容错能力和消息持久性。这些系统无法承受丢失消息或经历停机的后果。

  • 任务关键型应用程序:需要持续运行时间且不能容忍消息丢失的应用程序,例如医疗保健系统、实时监控或工业控制系统,非常适合仲裁队列。

  • 分布式系统:在服务器可能发生故障的多节点或分布式环境中,仲裁队列可确保消息处理无缝继续,即使单个节点出现故障也是如此。

性能基准测试:Classic 与 Quorum

    我们使用 RabbitMQ PerfTest 工具来评估经典队列和仲裁队列的性能。作为此分析的一部分,我们收集了三种不同场景的性能统计数据。每个场景都涉及发布者和使用者的不同组合,具有固定的消息大小和一致的 30 秒时间间隔。

经典队列性能

场景

发送速率 (MSG/S)

接收速率(MSG/S)

第 99 个百分位延迟(以微秒为单位)

场景 1 (1Publisher, 1Consumer)

13329

9897

20649010 微秒

方案 2 (1Publisher, 2Consumer)

14112

9573

21415269 微秒

方案 3(2Publisher、4Consumer)

21829

13577

27186651 微秒

平均值(全部)

16423

10349

23083643 微秒

仲裁队列性能

场景

发送速率 (MSG/S)

接收速率(MSG/S)

第 99 个百分位延迟(以微秒为单位)

场景 1 (1Publisher, 1Consumer)

9202

5581

37644181 微秒

方案 2 (1Publisher, 2Consumer)

10717

5368

29972278 微秒

方案 3(2Publisher、4Consumer)

13132

4505

32919489 微秒

平均值(全部)

11017

5151

33,511,316 微秒

从执行的测试中获得的见解

1. 吞吐量(发送和接收速率)
  • 经典队列:

    • 平均发送速率:16,423 msg/s(比 quorum 队列高 49%)

    • 平均接收速率:10349 msg/s(比 quorum 队列高 2 倍)

  • 仲裁队列

    • 平均发送速率:11,017 msg/s

    • 平均接收速率:5,151 msg/s

    Classic 队列在发送和接收速率方面始终优于 Quorum 队列,在所有场景中都显示出更高的吞吐量。Quorum 队列虽然更具弹性,但吞吐量会下降,尤其是在接收速率方面。

2. 延迟
  • 经典队列

    • 平均第 99 个百分位延迟:2308 万微秒。- 延迟保持可控并持续扩展,即使负载较高(2 个生产者,4 个消费者)也是如此。

  • 仲裁队列:

    • 平均第 99 个百分位延迟:3351 万 μs。- 延迟始终比传统队列高 40-50%,在较高负载下会出现显著峰值。

    由于复制和容错能力,仲裁队列会引入更多的延迟。对于低延迟至关重要的应用程序,经典队列是队列的明确选择。

3. 可扩展性
  • 经典队列

    • 随着负载的增加而线性扩展,在 1 个生产者/2 个消费者(场景 2)和 2 个生产者/4 个消费者(场景 3)的场景之间,发送和接收速率显着跳跃。

  • 仲裁队列

    • 在高负载下吞吐量不佳。在具有 2 个生产者和 4 个使用者的方案 3 中,仲裁队列仅显示发送速率略有增加,接收速率略有下降,这表明与传统队列相比可扩展性较差。

    Classic 队列可以有效地扩展,而 Quorum 队列则随着添加更多的创建者和使用者而显示吞吐量回报递减和延迟增加。

做出正确的选择

    在 RabbitMQ 中,在 Classic Queues 和 Quorum Queues 之间进行选择取决于您的系统在性能、持久性、容错能力和资源可用性方面的特定要求。

何时选择 Classic Queues

  • 高吞吐量和低延迟要求

  • 非关键应用程序

  • 单节点或低成本环境

何时选择 Quorum 队列

  • 高可用性和容错能力

  • 持久消息传递

  • 分布式系统

  • 任务关键型系统

Classic 队列和 Quorum 队列之间的权衡

方面

经典队列

仲裁队列

吞吐量

高吞吐量、低延迟

由于复制开销而降低吞吐量

耐久性

可选的单节点持久性

多节点复制的强大持久性

容错

有限(无复制,单节点故障影响)

高容错性(多节点复制)

可用性

取决于单节点可用性

通过自动领导者选举实现高可用性

资源使用情况

低(单节点,较少的磁盘和内存开销)

高(多个节点,较高的 CPU、内存、磁盘使用率)

延迟

低延迟(无复制)

由于 Raft 复制导致更高的延迟

用例

高性能、非关键应用程序

关键应用程序、高可用性、无消息丢失

详细信息源

    在决定 RabbitMQ 的 Classic 队列和 Quorum 队列时,重要的是要认识到两者各有优缺点。最佳选择取决于系统的特定需求。归根结底,在 Classic 队列和 Quorum 队列之间进行选择是一个决定,它取决于您在性能和可靠性之间的特定权衡:这是关于在速度和持久性之间找到适当的平衡。通过了解每种类型的队列的执行方式,您可以设计符合您的目标的 RabbitMQ 设置,无论是效率、健壮性,还是两者兼而有之。

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

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

相关文章

“类型名称”在Go语言规范中的演变

Go语言规范(The Go Programming Language Specification)[1]是Go语言的核心文档,定义了该语言的语法、类型系统和运行时行为。Go语言规范的存在使得开发者在实现Go编译器时可以依赖一致的标准,它确保了语言的稳定性和一致性&#…

Acwing 154. 滑动窗口

滑动窗口 输入: 8 3 1 3 -1 -3 5 3 6 7 输出: -1 -3 -3 -3 3 3 3 3 5 5 6 7 思路: 使用双端队列(deque)来维护一个区间的最值 具体做法: 双端队列里面存储元素的下标,我们先考虑如何维护区间里的数&#xf…

Elasticsearch讲解

1.Elasticsearch基本知识 1.基本认识和安装 Elasticsearch是由elastic公司开发的一套搜索引擎技术,它是elastic技术栈中的一部分。完整的技术栈包括: Elasticsearch:用于数据存储、计算和搜索 Logstash/Beats:用于数据收集 Kib…

Harbor的安装与使用

任务分析 一、规划节点 IP地址 主机名 节点 192.168.20.20 master 容器master节点 192.168.20.21 node 容器worker节点 二、基础准备 镜像使用CentOS7.9(主机配置自定义,推荐配置4vCPU/12G内存/100G硬盘),使用这两台云…

【软设】计算机网络

【软设】计算机网络 一.OSI/RM七层模型 (七层模型还是要知道的,后面再去记一些协议,知道每一层应用在哪些方面,给你个东西或者协议你要能看得出来) OSI/RM(Open Systems Interconnection Reference Model)是国际标准…

63.HDMI显示器驱动设计与验证-彩条实验

(1)常见的视频传输接口有三种: VGA 接口、 DVI 接口和 HDMI 接口,目前的显示设备都配有这三种视频传输接口。三类视频接口的发展历程为 VGA→DVI→HDMI。其中 VGA 接口出现最早,只能传输模拟图像信号; 随后…

【libp2p——NAT】

1. 什么是NAT NAT(Network Address Translation,网络地址转换)是指一种网络技术,它允许多个设备通过一个公共IP地址连接到互联网。NAT通常被用在家庭或小型办公室的路由器上,以允许多台计算机共享一个互联网连接。这种…

深入理解函数【JavaScript】

在 JavaScript 中,函数作为一种重要的基本结构,承载着编程中的许多关键概念。下面是与函数相关的内容介绍: 1. 函数定义 JavaScript 中有多种方式定义函数: 1.1 函数声明(Function Declaration) functi…

C# 委托(Delegate)一

一.Delegate的定义说明: C# 中的委托(Delegate)就是类似于 C 或 C 中函数的指针。Delegate 是存有对某个方法引用的一种引用类型变量,引用可在运行时是可以被改变的,特别适用于实现事件和回调方法。所有的Delegate都是…

C# 委托(Delegate)二

一.委托的多播(Multicasting of a Delegate): 委托对象,使用 "" 运算符进行合并,一个合并委托调用它所合并的两个委托。使用"-" 运算符从合并的委托中移除组件委托。 注:只有相同类型…

linux文件下载分类

在下载图片时各个网站命名不统一,管理起来很麻烦,想要写一个脚本将下载的图片或者其他资源实现格式统一,方便管理 $0:表示脚本路径。运行 ./myscript.sh,$0 将会保存 ./myscript.sh。 $1:表示传递给脚本的…

Leetcode 968. 监控二叉树 树形dp、状态机 C++实现

问题:Leetcode 968. 监控二叉树 给定一个二叉树,我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 /*** Definition for a binary tree node.* struct TreeNo…

数据结构 ——— 移除元素(快慢指针)

目录 题目要求 代码实现(快慢指针) 题目要求 编写函数,给你一个数组 nums 和一个值 val,你需要在 nums 数组 原地 移除所有数值等于 val 的元素,并且返回移除后数组的新长度 不能使用额外的数组空间,要…

数据统计与分析-Numpy入门

Numpy入门 导包1.演示Numpy的属性演示打印Numpy数据类型shape()形状维度ndim() 轴dtype() 元素类型size()元素个数itemsize()每个匀速所占大小 2.创建Numpy对象2.1数组方式创建,函数:arrray()2.2创建空的ndarray对象2.2.1 zeros()2.2.2 ones()2.2.3 empty() 2.3创建1个指定范围…

大数据毕业设计选题推荐-内蒙古旅游景点数据分析系统-Hive-Hadoop-Spark

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【智能控制】16章 基于Hopfield网络的路径优化,TSP问题

目录 15.6 基于Hopfield网络的路径优化 15.6.1 TSP问题 15.6.2 求解TSP问题的Hopfield神经网络设计 15.6 基于Hopfield网络的路径优化 15.6.1 TSP问题 旅行商问题(Traveling Salesman Problem,简称TSP)可描述为:已知N个城市之…

C# 的枚举(Enum)应用说明

一.Enum的定义&#xff1a; 枚举是一组命名整型的常量。枚举类型是使用 enum 关键字声明的&#xff0c;它是值类型。枚举包含自己的值&#xff0c;且不能继承或传递继承。 二.声明 enum 变量&#xff1a; 声明枚举的一般语法&#xff1a; enum <enum_name> { enumerati…

如何使用ssm实现基于BS的库存管理软件设计与实现+vue

TOC ssm708基于BS的库存管理软件设计与实现vue 绪论 课题背景 身处网络时代&#xff0c;随着网络系统体系发展的不断成熟和完善&#xff0c;人们的生活也随之发生了很大的变化。目前&#xff0c;人们在追求较高物质生活的同时&#xff0c;也在想着如何使自身的精神内涵得到…

FPGA学习(1)-mux2,2选1多路器

目录 1 开发板配套资料 1.1学习网址和资料网址 2.创建工程文件 2.1创建过程 2.2写程序及仿真测试 2.2.1 写程序生成电路 2.2.2仿真 2.2.3 生成执行文件并烧录 3.实验现象 买的小梅哥店铺的开发板&#xff1a;xc7z020clg400 看的小梅哥的视频&#xff1a;03C _基于ZYN…

Oracle 相关的工具使用 SQL Developer , sqlplus

Oracle 相关的工具使用 SQL Developer &#xff0c; sqlplus 一&#xff0c;Oracle SQL Developer 连接数据库 今天在连接sqldeveloper服务器时遇到了很多问题&#xff0c;但最终还是通过网上的博客解决了问题&#xff0c;我就在总结一下我的解决过程。 一.界面 首先&#…