日拱一卒,功不唐捐。大家好,最近有项目要用到消息队列,所以考虑到了使用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