RabbitMQ 队列之战:Classic 和 Quorum 的性能洞察
RabbitMQ 是一个功能强大且广泛使用的消息代理,它通过处理消息的传输、存储和交付来促进分布式应用程序之间的通信。作为消息代理,RabbitMQ 充当生产者(发送消息的应用程序)和使用者(接收消息的应用程序)之间的中介,即使在复杂的分布式环境中也能确保可靠的消息传递。
RabbitMQ 的核心组件之一是队列,消息在其中临时存储,直到被使用。队列在 RabbitMQ 的架构中起着关键作用,支持异步通信并将生产者和使用者解耦。这种解耦允许应用程序独立运行,从而提高可扩展性、弹性和容错能力。
了解 RabbitMQ 中不同类型队列的性能特征对于设计高效的系统架构至关重要。队列决定了消息的路由、存储和使用方式,从而影响吞吐量、延迟和持久性。
了解经典队列
RabbitMQ 中的经典队列是默认队列类型,旨在实现高吞吐量和简单性。它们遵循先进先出 (FIFO) 模型,其中消息按照接收顺序传送给使用者,从而确保可预测的消息流。Classic 队列广泛用于性能和速度比跨多个节点的容错和消息持久性更重要的场景。
Classic Queues 的主要功能
单节点存储:Classic 队列存储在单个 RabbitMQ 节点上。消息不会在其他节点之间复制,从而使队列更快,但在节点发生故障时弹性较差。
FIFO 消息处理:消息按照其到达的顺序进行存储和使用,从而确保简单的处理模型,尤其是对于消息顺序很重要的任务。
持久和非持久消息:Classic 队列可以将消息存储在内存中(瞬态)或磁盘(持久)中。持久性消息将保存到磁盘,确保在服务器重新启动或崩溃时消息不会丢失,尽管这会带来性能权衡。
高吞吐量:Classic 队列针对速度进行了优化,可以以低延迟处理大量消息。它们最适合消息处理速度至关重要的应用程序,例如实时系统或日志聚合服务。
单节点持久性:虽然 Classic 队列支持消息持久性,但它们缺乏跨节点复制。这意味着,如果托管队列的节点发生故障,持久消息将在节点恢复时继续存在,但没有内置冗余来继续跨其他节点进行操作。
Classic 队列的使用案例
实时系统:Classic 队列非常适合需要高速消息处理的应用程序,例如游戏系统、流媒体平台或监控工具。
无状态应用程序:不需要消息复制或跨节点高可用性的应用程序受益于 Classic 队列的简单性和性能。
低延迟:对于需要最大限度地减少消息生成和使用之间的延迟的工作负载,经典队列提供低延迟消息传递。
了解 Quorum 队列
RabbitMQ 中的仲裁队列是一种更新的、高度可用的、具有容错能力的队列类型,专为需要强大的持久性保证和节点故障弹性的系统而设计。Quorum 队列利用 Raft 共识算法跨多个节点复制消息,确保即使在硬件或软件故障的情况下也能保持消息可用性。这使它们非常适合消息丢失或停机不可接受的关键应用程序。
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 设置,无论是效率、健壮性,还是两者兼而有之。
相关文章:

RabbitMQ 队列之战:Classic 和 Quorum 的性能洞察
RabbitMQ 是一个功能强大且广泛使用的消息代理,它通过处理消息的传输、存储和交付来促进分布式应用程序之间的通信。作为消息代理,RabbitMQ 充当生产者(发送消息的应用程序)和使用者(接收消息的应用程序)之…...
Spring Boot 集成 MySQL 的详细指南
在现代软件开发中,Spring Boot 因其简单易用而成为构建 Java 应用程序的热门选择。结合 MySQL这一常用关系型数据库,开发者可以快速构建出功能完善的后端服务。本文将详细介绍如何将 Spring Boot 与 MySQL 集成,提供从环境搭建到代码实现的全…...
python格式化输入输出
以下是使用 format()、f-string 和百分号 % 运算符进行 Python 数据格式化输入输出的示例代码。 1. 使用 format() 方法进行格式化 # 使用 format() 方法格式化数据并输出到文件 name "Alice" age 25 score 92.5# 格式化字符串 formatted_string "Name: {…...

音视频入门基础:FLV专题(10)——Script Tag实例分析
一、引言 在《音视频入门基础:FLV专题(9)——Script Tag简介》中对FLV文件的Script Tag进行了简介。下面用一个具体的例子来对Script Tag进行分析。 二、Script Tag的Tag header实例分析 用notepad打开《音视频入门基础:FLV专题…...

国外问卷调查匠哥已经不带人了,但是还可以交流
国外问卷调查匠哥已经不带人了,但是还可以来和匠哥交流, 为啥不带人了呢? 从今年年初开始,匠哥在带学员的过程中发现: 跟往年同样的收费,同样的教学,甚至我付出的时间精力比以前还多ÿ…...

Linux 进程的基本概念及描述
目录 0.前言 1. 什么是进程 1.1 进程的定义与特性 1.2 进程与线程的区别 2.描述进程 2.1 PCB (进程控制块) 2.2 task_struct 3.查看进程 3.1 查看进程信息 3.1.1 /proc 文件系统 3.1.2 ps 命令 3.1.2 top 和 htop 命令 3.2 获取进程标识符 3.2.1使用命令获取PID 3.2.2 使用C语言…...

【C++】透过STL源代码深度剖析vector的底层
✨ Blog’s 主页: 白乐天_ξ( ✿>◡❛) 🌈 个人Motto:他强任他强,清风拂山冈! 🔥 所属专栏:C深入学习笔记 💫 欢迎来到我的学习笔记! 参考博客:【C】透过STL源…...

ubuntu 开启root
sudo passwd root#输入以下命令来给root账户设置密码 sudo passwd -u root#启用root账户 su - root#要登录root账户 root 开启远程访问: 小心不要改到这里了:sudo nano /etc/ssh/ssh_config 而是:/etc/ssh/sshd_config sudo nano /etc/ssh…...

使用 Llama 3.1 和 Qdrant 构建多语言医疗保健聊天机器人的步骤
长话短说: 准备好深入研究: 矢量存储的复杂性以及如何利用 Qdrant 进行高效数据摄取。掌握 Qdrant 中的集合管理以获得最佳性能。释放上下文感知响应的相似性搜索的潜力。精心设计复杂的 LangChain 工作流程以增强聊天机器人的功能。将革命性的 Llama …...

【Linux-基础IO】如何理解Linux下一切皆文件磁盘的介绍
目录 如何理解Linux系统上一切皆文件 1.物理角度认识磁盘 2.对磁盘的存储进行逻辑抽象 磁盘寻址 3.磁盘中的寄存器 如何理解Linux系统上一切皆文件 计算机中包含大量外设,操作系统想要管理好这些外设,就必须对这些外设进行先描述再组织,…...

Golang | Leetcode Golang题解之第436题寻找右区间
题目: 题解: func findRightInterval(intervals [][]int) []int {n : len(intervals)type pair struct{ x, i int }starts : make([]pair, n)ends : make([]pair, n)for i, p : range intervals {starts[i] pair{p[0], i}ends[i] pair{p[1], i}}sort.…...

微服务SpringSession解析部署使用全流程
目录 1、SpringSession简介 2、实现session共享的三种方式 1、修改Tomcat配置文件 2、Nginx负载均衡策略 3、redis统一存储 0、准备工作 1、本地服务添加依赖 2、修改本地服务配置文件 3、添加application.properties文件 4、添加nacos - redis配置 5、修改本地项目…...
自动驾驶 3DGS 学习笔记
目录 street_gaussians gsplat依赖项 运行报错: python>3.9 SGD: Street View Synthesis with Gaussian Splatting and Diffusion Prior 差分高斯光栅化 diff-gaussian-rasterization street_gaussians https://github.com/zju3dv/street_gaussians gsp…...

【C++笔试强训】如何成为算法糕手Day5
学习编程就得循环渐进,扎实基础,勿在浮沙筑高台 循环渐进Forward-CSDN博客 目录 循环渐进Forward-CSDN博客 第一题:游游的you 思路: 第二题:腐烂的苹果 思路: 第三题:孩子们的游戏 思路&…...
【Qt】无IDE的Gui程序快速开始
Qt安装 在 Windows 上安装 Qt 的步骤如下: 下载 Qt 安装程序 访问 Qt 的官方网站:Qt Downloads。点击“Download”按钮,下载 Qt Online Installer(在线安装程序)。 运行安装程序 双击下载的 QtInstaller.exe 文件…...

Python编码系列—Python备忘录模式:掌握对象状态保存与恢复技术
🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…...
linux常用命令汇编(持续更新)
一、用户提示符 # root账号提示符 $ 普通用户提示符 二、关闭计算机 shutdown(安全有序地关闭计算机) 语法:shutdown [options] [time] [message] shutdown -h now #立即关机(--halt/终止) shutdown -r now #重…...

AI面试指南:AI工具总结评测,助力求职季
AI面试指南:AI工具总结评测,助力求职季 摘要: 在竞争激烈的AI领域秋招季,准备充分并借助高效工具是提升面试通过率的关键。本文主要介绍一些针对秋招的AI面试工具和学习资源,分为简历优化、面试助手、手撕代码练习三个…...
大二考核题解
大二考核题解 题号题目考察知识点A有意思的监考二分答案B海绵宝宝的数独DFSC走楼梯递推D碱基配对kmpE好简单的题啊,写它!最短路 写在前面: 整体难度不大,代码能力需要一些,正常来说至少要会3题以上 A 有意思的监考 …...
深入解析:Kubernetes 如何使用 etcd 作为配置中心和注册中心
在 Kubernetes 中,etcd 是核心的分布式存储组件,负责存储和管理集群的所有配置信息、状态数据以及服务注册信息。etcd 的高可用性和强一致性使得它成为 Kubernetes 的 “source of truth”,确保集群能够动态、高效地管理资源,并保…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...