RabbitMQ系列(五)基本概念之Queue

devtools/2025/3/1 23:53:49/

在 RabbitMQ 中,Queue(队列) 是存储消息的容器,也是消息传递的核心载体。以下是其核心特性与作用的全方位解析:


一、Queue 的定义与核心作用

  1. 消息存储容器
    • Queue 是 RabbitMQ 中实际存储消息的实体,生产者发送的消息最终会被路由到队列中,等待消费者处理。
    • 类比:类似于“邮箱”,消息在队列中按顺序排列,消费者按需读取。
  2. 消费者与消息的解耦
    • 生产者仅需关注将消息发送到 Exchange(交换机),无需关心消费者数量和消费速度;消费者独立从队列中拉取或接收推送的消息,从而做到和生产者和Exchange的解耦。

二、Queue 的核心特性

1. 消息持久化
  • 如果希望 RabbitMQ 服务重启后,队列及其中的消息仍会保留(需要将消息本身也标记为持久化),那么可以将队列可声明为 持久化(Durable)
  • 非持久化队列 会在服务重启后自动删除。
2. 消息顺序性
  • 队列中的消息默认按 先进先出(FIFO) 顺序被消费,但优先级队列(Priority Queue)可支持按优先级处理消息。
3. 消费者订阅方式
  • 推送模式(Push):消费者通过 basic.consume 订阅消息队列,消息会自动推送给消费者。
  • 拉取模式(Pull):消费者通过 basic.get 主动拉取消息,适用于低频消费场景,比如出发接口主动刷新获取最新消息。
4. 消息确认机制(ACK)
  • 消费者处理消息后需发送 ACK 确认(ACK是acknowledge的缩写,意为确认),RabbitMQ 才会从队列中删除消息;若未确认或连接中断,消息会重新入队或根据配置转移到死信队列。

三、Queue 的生命周期与配置

  1. 队列声明参数
    • exclusive:是否为独占队列(仅允许当前连接访问,连接关闭后队列自动删除)。
    • auto-delete:如果设置为true,当最后一个消费者断开连接后,队列会自动删除,否则相反。
  2. 队列绑定规则
    • 队列需通过 Binding(绑定) 与 Exchange 关联,并指定 Routing Key(路由键),由 Exchange 根据类型(如 Direct、Fanout)决定消息如何路由到队列。
    • 示例:Fanout Exchange 会将消息广播到所有绑定的队列,Topic Exchange 支持通配符匹配路由键。

四、Queue 的权限与隔离

  • Virtual Host 隔离:队列隶属于某个 Virtual Host,不同 Virtual Host 中的队列完全隔离,用户需授权才能访问。
  • 多租户支持:适用于多团队/多环境场景,避免命名冲突。开发、测试和生产不同的环境可以考虑使用不同的virtual host来解决

五、典型应用场景

  1. 任务队列:将耗时任务(如邮件发送)异步处理,提升系统响应速度。
  2. 发布/订阅模式:结合 Fanout Exchange 实现消息广播。
  3. 延迟队列:通过死信队列(Dead Letter Queue)实现消息延迟处理(如订单超时关闭)。
  4. 流量削峰:在高并发场景下缓冲请求,避免系统过载。

六、操作示例

// 声明一个持久化队列(若不存在则创建)
channel.queueDeclare("order_queue",  true, false, false, null);
// 绑定队列到交换机,指定路由键
channel.queueBind("order_queue",  "direct_exchange", "order.create"); 

总结对比

特性说明
持久性决定队列和消息是否在服务重启后保留
独占性控制队列是否仅限当前连接访问
自动删除根据消费者连接状态自动清理队列
消息确认机制确保消息可靠消费,避免丢失

通过合理配置队列属性和绑定规则,可实现灵活的消息处理逻辑,满足不同业务场景需求。


http://www.ppmy.cn/devtools/163760.html

相关文章

【Linux】ubuntu server扩容硬盘

ubuntu server扩容硬盘 执行:lsblk lsblk # 看看硬盘设备输出如下: (base) difydify:~$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 73.9M 1 loop /snap/core22/1748 loop1 7:1 0 69.6M 1 loop /snap/go/10853 loop2 7:2 0 44.4M 1…

【前端】react+ts 轮播图的实现

一、场景描述 在很多网站的页面中都有轮播图,所以我想利用react.js和ts实现一个轮播图。自动轮播图已经在前面实现过了,如:https://blog.csdn.net/weixin_43872912/article/details/145622444?sharetypeblogdetail&sharerId145622444&a…

Java线程池

(一)线程池的优势 总的来说,池化技术都有以下几个优势 1.降低资源消耗:减少了我们频繁地去创建和销毁线程 2.提高响应速度:当任务到达时,任务不需要等待线程的创建,直接拿到一个线程就可以响应…

SQL Server2019安装步骤+使用+解决部分报错+卸载(超详细 附下载链接)

1、下载安装SQL Server2019 第一步:官网下载安装包SQL Server 2019 - 定价 | Microsoft 【以下内容图片借用SQL Server2019安装步骤(超详细 附下载链接) - 掘金中内容】 第二步:打开安装包,并选择基本. 第三步&#…

Docker迁移/var/lib/docker之后镜像容器丢失问题

迁移/var/lib/docker时,如果目标目录少写一个/,/etc/docker/daemon.json中的data-root后面需要多加一级目录docker。 若迁移命令如下 rsync -avz /var/lib/docker /home/docker/ 在/etc/docker/daemon.json中添加如下内容 "data-root": &q…

win11本地部署deepseek大模型(安装ollama+docker+open-webui)最终实现自己的项目可通过API调用投喂数据后的模型

硬件配置:笔记本win11,内存32G,CPU锐龙7 ,无独显;只能考虑deepseek-r1:1.5b模型。 第一步:安装Ollama 此处不过多累赘了,https://ollama.com/官网选择对应的系统版本下载即可。 需要注意的是…

【PCIe 总线及设备入门学习专栏 10.1 -- Linux PCIe 驱动框架 之 RK3399 Region1 访问】

文章目录 CPU 读写 region 0 的地址MEM/IO 读写示例配置 Region1 用于内存读写配置 Region 1 地址转换Region 1 地址访问desc registersCPU 读写 region 0 的地址 本篇文章紧接【PCIe 总线及设备入门学习专栏 10 – Linux PCIe 驱动框架】 由【PCIe 总线及设备入门学习专栏 1…

【 实战案例篇三】【某金融信息系统项目管理案例分析】

大家好,今天咱们来聊聊金融行业的信息系统项目管理。这个话题听起来可能有点专业,但别担心,我会尽量用大白话给大家讲清楚。金融行业的信息系统项目管理,说白了就是如何高效地管理那些复杂的IT项目,确保它们按时、按预算、按质量完成。咱们今天不仅会聊到一些理论,还会通…