详解RabbitMQ三种队列类型

news2024/11/26 22:49:29

RabbitMQ 是一个强大的消息队列系统,它提供了多种队列类型以满足不同的使用需求。本文将探讨三种主要队列类型:经典队列、仲裁队列和流式队列,并讨论它们的区别和选型建议。

经典队列(Classic Queues)

简介:

经典队列是 RabbitMQ 中最早期也是最常用的一种队列类型。它们具有良好的性能和稳定性,适合大多数常规的消息传递场景。

特点:

  • 存储机制:消息存储在磁盘或内存中,支持持久化。

  • 消息传递:一旦消息被消费者确认,消息会从队列中删除。

  • 性能:性能相对较高,但在高并发和大消息量场景下,可能会遇到瓶颈。

  • 高可用性:支持镜像队列,实现高可用性。镜像队列中的消息会复制到多个节点,以防单节点故障。

适用场景:

适合大多数常规消息传递场景,如任务调度、事件通知等。

当需要消息的持久化存储和高可靠性时,经典队列是一个很好的选择。

仲裁队列(Quorum Queues)

简介:

仲裁队列是一种基于 Raft 协议实现的新型队列,专为提高数据一致性和可靠性而设计。

特点:

  • 存储机制:消息存储在多个节点上,采用 Raft 协议确保数据一致性。

  • 高可用性:天然支持高可用性,通过多节点复制实现数据冗余。

  • 数据一致性:仲裁队列确保每条消息在多个副本之间的一致性,避免单点故障导致的数据丢失。

  • 性能:由于需要确保数据一致性,性能可能比经典队列略低,适合对数据一致性要求较高的场景。

适用场景:

  • 适用于对数据一致性和高可用性要求较高的场景,如金融交易、订单处理等关键业务系统。

  • 在需要确保消息不丢失且需要高可用性的情况下,仲裁队列是一个理想选择。

注意事项

  1. 仲裁队列只能声明为持久的

仲裁队列只能被声明为持久的,否则会引发以下错误消息: :server_initiated_close,406,“PRECONDITION_FAILED - 队列‘my-quorum-queue’的属性‘non-durable’无效

Quorum 队列具有一些特殊功能和限制。它们不能是非持久的,因为 Raft 日志始终写入磁盘,因此它们永远不能被声明为瞬态的。从 3.8.2 开始,它们也不支持消息 TTL 和消息优先级 2。

  1. 仲裁队列的消息默认就是持久化的

对mq熟悉的老铁应该知道,队列的持久化和消息的持久化是分开的。一般情况下如果不对消息声明为持久化的,服务重启之后消息就会丢失。但是仲裁队列默认消息就是持久化的。

下面我手撸了一个简单的demo,同时给经典队列和仲裁队列各发送一条消息。

然后我们重启服务,发现经典队列的消息已经丢失了,但是仲裁队列的消息还在队列中。

仲裁队列 VS 经典队列

数据一致性

仲裁队列使用 Raft 共识算法来确保数据的一致性。即使在单节点情况下,仲裁队列也会严格遵循日志记录和确认机制,确保消息的顺序和一致性。而经典队列在单节点情况下可能会因节点故障导致数据丢失或不一致。

数据可靠性

仲裁队列会将每条消息记录到持久存储中,确保即使在系统崩溃后,消息也不会丢失。经典队列虽然也支持消息持久化,但其可靠性依赖于消息写入磁盘的速度和节点的稳定性。

流式队列(Stream Queues)

流式队列是一种新型队列,专为处理大规模数据流和高吞吐量场景设计。

特点:

  • 存储机制:消息以流的形式存储,可以实现消息的回放和重复消费。

  • 高吞吐量:设计上优化了高吞吐量和低延迟,适合处理大规模实时数据流。

  • 数据持久性:消息可以持久化存储,支持长时间的消息保留和回溯。

  • 订阅机制:支持多种订阅模式,允许多个消费者按需订阅消息流。

什么是消息回放和重复消费?

  • 消息回放:允许消费者在任何时间点重新读取过去的消息。这对于需要重现历史事件或进行审计的应用程序特别有用。

  • 重复消费:消费者可以多次消费同一条消息,这在调试和处理异常时尤为重要。

下面我们通过一个简单的例子看看重复消费

public void InitStreamMQ()
{
    var factory = new ConnectionFactory() { HostName = "localhost", UserName = "user", Password = "myrabbit" };

    var connection = factory.CreateConnection();

    var channel = connection.CreateModel();

    // 声明流式队列

    var args = new Dictionary<string, object> { { "x-queue-type", "stream" } };

    channel.QueueDeclare(queue: "stream_queue", durable: true, exclusive: false, autoDelete: false, arguments: args);

    channel.QueueBind(queue: "stream_queue", exchange: "amq.direct", routingKey: "stream_queue");

}


[ActionTitle(Name = "订阅队列")]
[Route("subscribe")]
public void SubscribeQuorumMessage()
{

    var factory = new ConnectionFactory() { HostName = "localhost", VirtualHost = "/", UserName = "user", Password = "myrabbit" };

    var connection = factory.CreateConnection();

    var channel = connection.CreateModel();

    channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);

    // 设置消费者,从指定的偏移量消费消息

    var consumer = new EventingBasicConsumer(channel);

    consumer.Received += (model, ea) => {

        var body = ea.Body.ToArray();

        var message = Encoding.UTF8.GetString(body);

        Console.WriteLine(" [x] Received {0}", message);

    };

    /**

     * x-stream-offset的可选值有以下几种:

        first: 从日志队列中第一个可消费的消息开始消费

        last: 消费消息日志中最后一个消息

        next: 相当于不指定offset,消费不到消息。

        Offset: 一个数字型的偏移量

        Timestamp:一个代表时间的Data类型变量,表示从这个时间点开始消费。例如 一个小时前 Date timestamp = new Date(System.currentTimeMillis() - 60 * 60 * 1_000)

     */

    var args = new Dictionary<string, object> { { "x-stream-offset", 2 } };

    channel.BasicConsume(queue: "stream_queue", autoAck: false, arguments: args, consumer: consumer);

}

这里我们往流式队列里面发送了10条消息但是每次消费的时候都从第3条消息(offset为2)开始消费。

流式队列的工作原理

流式队列的工作方式类似于日志系统(如 Apache Kafka)。消息按照顺序追加到队列的末尾,并保存在磁盘上。每个消息都有一个唯一的偏移量(offset),消费者可以通过指定偏移量来读取特定的消息或重新消费消息。

适用场景:

  • 适用于实时数据分析、日志处理、实时监控等场景。

  • 在需要处理大规模数据流和高吞吐量的场景下,流式队列是一个合适的选择。

PS

  1. Auto-Ack 必须为 false

在流式队列中,为了确保消息的可靠性和能够实现消息回放,自动确认(autoAck)必须设置为 false。自动确认会导致消息一旦被消费即刻从队列中移除,失去消息的持久性和回放功能。

  1. 必须设置prefetchCount

流式队列(Stream Queue)在 RabbitMQ 中主要设计用于高吞吐量和低延迟的消息传输。设置 prefetchCount(每次发送给消费者的消息数量)是为了优化流式队列的性能和资源使用。

  1. durable必须设置为true

与Quorum队列类似, Stream队列的durable参数必须声明为true,exclusive参数必须声明为false。这其中,x-max-length-bytes 表示日志文件的最大字节数。x-stream-max-segment-size-bytes 每一个日志文件的最大大小。这两个是可选参数,通常为了防止stream日志无限制累计,都会配合stream队列一起声明。

选型建议

在选择 RabbitMQ 队列类型时,需要根据具体的业务需求和场景来决定。以下是一些选型建议:

  1. 经典队列:

   - 适合大多数常规的消息传递需求。

   - 需要较高的性能和可靠性,但不需要特别高的数据一致性要求。

  1. 仲裁队列:

   - 适用于对数据一致性和高可用性要求较高的场景。

   - 需要确保消息不丢失且能够在多节点间保持数据一致性。

  1. 流式队列:

   - 适合处理大规模实时数据流和高吞吐量的场景。

   - 需要消息的回放和重复消费功能,适用于实时数据分析和日志处理等场景。

总结

通过了解经典队列、仲裁队列和流式队列的特点和应用场景,能够更好地选择适合自己业务需求的队列类型。在实际应用中,可以根据具体的业务需求和性能要求,灵活地选择和配置 RabbitMQ 队列,以实现最佳的消息传递效果。

参考文档

Quorum Queues

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

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

相关文章

CytoSPACE·空转和单细胞数据的高分辨率比对

1. 准备输入文件&#xff0c;需要四个文件&#xff0c;所有文件都应以制表符分隔的表格输入格式 (.txt) 提供。 a. scRNA-seq 基因表达文件 矩阵必须是基因&#xff08;行&#xff09;乘以细胞&#xff08;列&#xff09;。 第一行必须包含单个细胞 ID&#xff0c;第一列必须…

react使用Fullcalendar

前言&#xff1a; 最近在做项目时&#xff0c;遇到了需要用日历的项目。一开始考虑使用antd的日历组件。后来 调研技术库&#xff0c;发现了fullcalendar 库。经过对比 fullcalendar 更强大&#xff0c;更灵活。 其实 antd的日历组件 也不错&#xff0c;简单的需求用他也行。…

LabVIEW过程控制实验平台

A3000实验平台通过LabVIEW开发&#xff0c;实现了过程控制的虚拟仿真与实时通信&#xff0c;显著提高了教学与实验的互动性和效率。该平台采用模块化设计&#xff0c;支持多种控制策略的实验教学&#xff0c;克服了传统实验设备的不足。项目背景 目前高校过程控制实验设备普遍…

腾讯会议pc端3.29.11开启悬浮窗口

之前是&#xff1a;pc端每次最小化&#xff0c;它就自动收回到任务栏里了 版本&#xff1a;3.29.11 解决办法&#xff1a; 打开腾讯会议&#xff0c;点击左上角的【头像】。 单击【设置】。 选择【显示当前说话者】来管理麦克风浮窗。 再进入会议&#xff0c;点击最小化一哈&…

聊一聊:ChatGPT搜索引擎会取代谷歌和百度吗?

当地时间 10 月 31 日&#xff0c;OpenAI 正式推出了 ChatGPT 搜索功能&#xff0c;能实时、快速获取附带相关网页来源链接的答案。这一重大升级标志着其正式向谷歌的搜索引擎霸主地位发起挑战。 本周五我们聊一聊&#xff1a; 欢迎在评论区畅所欲言&#xff0c;分享你的观点~ …

贪心算法习题其四【力扣】【算法学习day.21】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

python实战项目52:Selenium爬取steam黑神话悟空评论

python实战项目52:Selenium爬取steam黑神话悟空评论 一、思路分析二、完整代码一、思路分析 Selenium爬取steam游戏评论的思路非常简单,初始化Chromedriver,然后打开评论页面,循环下拉滚动条,每下拉一次滚动条获取一次页面源代码,使用xpath解析数据并保存数据。本文的主…

Claude 3.5 新功能 支持对 100 页的PDF 图像、图表和图形进行可视化分析

Claude 3.5 Sonnet发布PDF图像预览新功能&#xff0c;允许用户分析长度不超过100页的PDF中的视觉内容。 此功能使用户能够轻松上传文档并提取信息&#xff0c;特别适用于包含图表、图形和其他视觉元素的研究论文和技术文档。 视觉PDF分析&#xff1a;用户现在可以从包含各种视觉…

【Qt c++】Qt内置图标

Qt内置图标 前言简例示例 前言 Qt内置图标封装在QStyle中&#xff0c;大概七十多个图标&#xff0c;可以直接拿来用。图标的大小&#xff1a;我认为 size 30 还是可以的. 简例 SP_TitleBarMenuButton, SP_TitleBarMinButton, SP_TitleBarMaxButton, SP_TitleBarCloseButton…

Redis 的使⽤和原理

第一章:初识 Redis 1.1盛赞 Redis Redis 是⼀种基于键值对&#xff08;key-value&#xff09;的 NoSQL 数据库&#xff0c;与很多键值对数据库不同的是&#xff0c;Redis 中的值可以是由 string&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&…

【Clikhouse 探秘】ClickHouse 物化视图:加速大数据分析的新利器

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

atest v0.0.18 提供了强大、灵活的 HTTP API Mock 功能

atest 发布 v0.0.18 atest 是致力于帮助开发者持续保持高质量 API 的开源接口工具。 你可以在命令行终端或者容器中启动&#xff1a; docker run -p 8080:8080 ghcr.io/linuxsuren/api-testing:v0.0.18 亮点 在开源之夏 2024 中 atest 增加了基于 MySQL 的测试用例历史的支持HT…

深度了解flink(十) JobManager(4) ResourceManager HA

ResourceManager&#xff08;ZK模式&#xff09;的高可用启动流程 ResourceManager启动流程在DefaultDispatcherResourceManagerComponentFactory#create中 public DispatcherResourceManagerComponent create(Configuration configuration,ResourceID resourceId,Executor i…

Linux系统编程——信号的基本概念(信号产生于处理、可靠信号、可重入函数、SIGCHLD)

一、什么是信号 1、信号的定义 信号是UNIX和Linux系统响应某些条件而产生的一个事件&#xff0c;接收到该信号的进程会相应地采取一些行动。信号是软中断&#xff0c;通常信号是由一个错误产生的。但它们还可以作为进程间通信或修改行为的一种方式&#xff0c;明确地由一个进程…

节省50%人工录入时间!免费开源AI工具让法律文件数据提取更高效

法律行业痛点&#xff1a;处理大量的合同、诉讼材料和财务报告等文件是一项繁琐且耗时的工作。这些文件中的表格常包含关键信息&#xff0c;如费用清单、时效统计和条款列表等&#xff0c;手动录入和整理这些数据不仅效率低下&#xff0c;而且容易出错。表格识别技术&#xff0…

单智能体carla强化学习实战工程介绍

有三个工程&#xff1a; Ray_Carla: 因为有的论文用多进程训练强化学习&#xff0c;包括ray分布式框架等&#xff0c;这里直接放了一个ray框架的示例代码&#xff0c;是用sac搭建的&#xff0c;obs没用图像&#xff0c;是数值状态向量值&#xff08;速度那些&#xff09;。 …

消息队列面试——打破沙锅问到底

消息队列的面试连环炮 前言 你用过消息队列么&#xff1f;说说你们项目里是怎么用消息队列的&#xff1f; 我们有一个订单系统&#xff0c;订单系统会每次下一个新订单的时候&#xff0c;就会发送一条消息到ActiveMQ里面去&#xff0c;后台有一个库存系统&#xff0c;负责获取…

第02章 MySQL环境搭建

一、MySQL的卸载 如果安装mysql时出现问题&#xff0c;则需要将mysql卸载干净再重新安装。如果卸载不干净&#xff0c;仍然会报错安装不成功。 步骤1&#xff1a;停止MySQL服务 在卸载之前&#xff0c;先停止MySQL8.0的服务。按键盘上的“Ctrl Alt Delete”组合键&#xff0…

向量数据库指南》——解锁多模态RAG应用,引领智能问答新时代!

多模态 RAG 应用:解锁智能问答的新维度 在当今这个信息爆炸的时代,我们每天都需要处理海量的数据,这些数据以多种形式存在,包括文本、图像、音频和视频等。随着人工智能技术的飞速发展,尤其是大型语言模型(LLM)的广泛应用,我们越来越依赖于这些智能系统来理解和回应我…

【MySQL 保姆级教学】 复合查询--超级详细(10)

复合查询 1. 复合查询的作用2. 创建将进行操作的表2.1 员工表 emp2.2 部门表 dept2.3 薪资等级表 3. 基本查询回顾4. 多表查询4.1 多表查询的定义4.2 笛卡尔积4.3 内连接 inner join4.4 交叉连接 cross join4.5 左外连接 left join4.6 右外连接 right join4.7 自连接 5. 子查询…