news 2025/12/19 23:31:22

rabbitmq-深入理解exchange/queue/routing-key等概念

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
rabbitmq-深入理解exchange/queue/routing-key等概念

​ 日拱一卒,功不唐捐。大家好,最近有项目要用到消息队列,所以考虑到了使用rabbitmq。使用rabbitmq之前需要对其相关理论概念有些了解,大家一块熟悉一下。

​ RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在不同的应用之间共享数据(跨平台跨语言)。RabbitMQ是使用Erlang语言编写,并且基于AMQP协议实现。消息队列的主要用途包括应用解耦以及削峰填谷的用。

​ 这里梳理了一下都涉及的相关概念:exchange,queue,producer,consumer,route,vhost,message,channel,user,binding,bindingKey 大家看看如果还缺啥补充。

1. Producer/Consumer-生产者/消费者

这个还是比较好理解的,生产者和消费者,就好比日常生活中的商品的生产和消费一样,消息队列中的生产者生产并推送消息,消费者接受并消费处理消息。

2. Queue-消息队列

传统队列就是一种存储数据的结构,这里的queue就是Rabbitmq中的一种资源对象,用于存储消息,每个消息最终都得落到队列里面。

3. Exchange-交换机

生产者将消息发送到 Exchange,由 Exchange 将消息路由到一个或多个 Queue 中(或者丢弃)。Exchange 根据消息的属性或内容路由消息。

3.1 exchange types
exchange 类型特点备注
direct点对点/一对一,精确匹配特定queue考虑routing key,消息直接路由至特定queue
topic一对一或一对多,模糊匹配,灵活度高,性能差考虑routing key,支持 “#”和“*”通配符的路由键,匹配多个队列
fanout广播/发布订阅,匹配多个queue不考虑routing key,广播消息至 bind该exchange的所有queue
rpc类似hook模式发送消息,监听回调队列,实现rpc
4. Routing Key-路由键

生产者在将消息发送到 Exchange 的时候,一般会指定一个 routing key,来指定这个消息的路由规则,而这个 routing key 需要与 Exchange Type 及 binding key 联合使用才能最终生效。

在 Exchange Type 与 binding key 固定的情况下(在正常使用时一般这些内容都是固定配置好的),我们的生产者就可以在发送消息给 Exchange 时,通过指定 routing key 来决定消息流向哪里。

5. Vhost

虚拟主机(Virtual Host,Vhost),用作逻辑隔离,可以理解为独立的命名空间,分别管理各自的 Exchange、Queue 和 Binding,使得应用安全的运行在不同的 Vhost 实例上,相互之间不会干扰。一个实例下可以有多个 Vhost,一个 Vhost 里面可以有若干个 Exchange 和 Queue。生产者和消费者连接消息队列 RabbitMQ 版需要指定一个 Vhost。

6. User

RabbitMQ 版集群内部做权限划分的最小单位,您可以通过为用户配置权限为其赋予不同 Vhost 下的配置和读写权限。

每个用户都可以设置用户密码:用户可以通过在客户端中添加用户名和密码来访问RabbitMQ 版集群进行消息的生产消费。

每个用户都可以赋予权限:权限指的是用户对该 Vhost 下 Exchange,Queue的操作权限,包括配置权限,读写权限。配置权限会影响 Exchange,Queue的声明和删除。读写权限影响从 Queue 里读取消息,向 Exchange 发送消息以及 Queue 和 Exchange 的绑定(binding)操作。

7. Binding

RabbitMQ 中通过 Binding 将 Exchange 与 Queue 关联起来,这样 RabbitMQ 就知道如何正确地将消息路由到指定的 Queue了。

7.1 BindingKey

在绑定(Binding)Exchange 与 Queue 的同时,一般会指定一个 binding key;生产者将消息发送给 Exchange 时,一般会指定一个 routing key;当 binding key 与 routing key 相匹配时,消息将会被路由到对应的 Queue 中。

在绑定多个 Queue 到同一个 Exchange 的时候,这些 Binding 允许使用相同的 binding key。

binding key 并不是在所有情况下都生效,它依赖于 Exchange Type,例如 fanout 类型的 Exchange 就会无视 binding key,而是将消息路由到所有绑定到该 Exchange 的 Queue。

8. Channel

信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内地虚拟链接,AMQP命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说,建立和销毁TCP都是非常昂贵的开销,所以引入了信道的概念,以复用一条TCP连接。

参考:

https://www.rabbitmq.com/tutorials/tutorial-one-python

https://www.cnblogs.com/xiaozhang666/p/13866121.html

https://cloud.tencent.com/document/product/1495/61825

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/18 19:52:32

go为什么设计成源码依赖,而不是二进制依赖

Go 选择源码依赖(Source-based Dependency) 而非二进制依赖(Binary Dependency)(如 Java 的 JAR 包或 C 的 .a/.so/.dll 文件),是经过深思熟虑的,主要基于以下几个核心原则&#xff…

作者头像 李华
网站建设 2025/12/18 19:52:04

从“能跑”到“可持续”:Java 在长期演进系统中的工程价值再思考

在技术更新频率越来越快的今天,Java 常常被贴上“成熟”“稳定”“传统”的标签。在一些新技术浪潮中,它甚至被误解为“不够前沿”。但在真实的大型系统、核心业务平台、金融级与工业级系统中,Java 依然是最常见、最可靠的选择之一。 如果仅从…

作者头像 李华
网站建设 2025/12/18 19:51:45

从“哑巴英语”到脱口而出:三条实战路径揭晓

“背了十年单词,一开口还是小学生。”——这句话戳中过太多人。口语之所以难,并非难在发音,而是难在“即时组织即时输出”的双线程任务。过去三个月,我靠每天 25 分钟“微习惯”训练,把雅思口语从 5.5 拉到 7.0&#x…

作者头像 李华
网站建设 2025/12/18 19:51:21

5.7W25Q64 实验(上)-嵌入式铁头山羊STM32笔记

目录 实验目标 实验目标: 通过 MCU 的 SPI 总线, 控制 W25Q64 存储一字节数据; 然后将存储的数据通过 SPI 读出来 上期纠错 问题 1:PA15 需要重映射,不能当做普通 IO 直接作为 CS 引脚 问题 2:PA15 初…

作者头像 李华
网站建设 2025/12/18 19:50:57

Groovy对业务能力扩展

一、前言因为之前在项目中使用了Groovy对业务能力进行一些扩展,效果比较好,所以简单记录分享一下,这里你可以了解:为什么选用Groovy作为脚本引擎了解Groovy的基本原理和Java如何集成Groovy在项目中使用脚本引擎时做的安全和性能优…

作者头像 李华
网站建设 2025/12/18 19:50:45

[GDOUCTF 2023]Shellcode

第一次打CTF——PWN篇学习笔记18向name中注入shellcode再栈溢出返回到该地址执行即可,注意shellcode长度不能超过0x25from pwn import * import struct ​ context.arch amd64 context.os linux ​ #io process(./pwn) io remote("node4.anna.nssctf.cn&qu…

作者头像 李华