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

相关推荐
bailaoshi6662 小时前
Spring WebFlux整合reactor-rabbitmq
spring·rabbitmq·java-rabbitmq
金海境科技2 小时前
【服务器数据恢复】H3C华三Ceph分布式存储文件丢失数据恢复案例
服务器·经验分享·分布式·ceph
赫尔·普莱蒂科萨·帕塔2 小时前
Kurator 分布式云原生环境技术深度分析与实践指南
分布式·云原生
永亮同学2 小时前
【探索实战】从“工具堆叠”到“平台治理”:基于 Kurator 构建统一分布式云原生管理底座的实践与思考
分布式·云原生
一起养小猫2 小时前
【探索实战】Kurator云边协同实践:基于KubeEdge的分布式物联网平台构建
分布式·物联网·struts
Wang's Blog2 小时前
RabbitMQ: 基于Docker技术实施集群部署实战指南
分布式·docker·rabbitmq
gordon~92 小时前
RabbitMQ -消息可靠 的实战示例
分布式·消息队列·rabbitmq·消息可靠性
Wang's Blog3 小时前
RabbitMQ:高效消息处理与资源管理实践
分布式·rabbitmq
脸大是真的好~17 小时前
分布式锁-基于redis实现分布式锁(不推荐)- 改进利用LUA脚本(不推荐)前面都是原理 - Redisson分布式锁
redis·分布式·lua