RabbitMQ 基础介绍
TL;DR
RabbitMQ 是一个默认基于 AMQP 协议的消息队列系统,本文解释介绍 RabbitMQ 的基础概念、数据传输机制和流程,帮助快速了解 RabbitMQ 和进行相关开发。本文重点在解释什么是 RabbitMQ、RabbitMQ 是如何运行的。至于为什么使用消息队列?为什么使用 RabbitMQ?请参考其他文章。
概念
- Producer (生产者): 发送消息的应用。
- Consumer (消费者): 接收消息的应用。
- Queue (队列): 存储消息的缓冲区。
- Message (消息): Producer 通过 RabbitMQ 发送给 Consumer 的信息。
- Connection (连接): 应用和 RabbitMQ 之间的 TCP 连接。
- Channel (通道): 连接内部的虚拟连接,当发送或接收 Queue 中的消息时,都是通过通道完成的。
- Exchange (交换机): 根据 Producer 定义的消息类型规则,接收来自 Producer 的消息并将消息推送到 Queue 中。Exchange 至少要 Binding 一个 Queue,否则默认情况下消息会被丢弃。
- Binding (绑定): Binding 是 Queue 和 Exchange 之间的连接。
- Routing key (路由键): Producer 可以发送的额外参数,Exchange 用来确定如何将消息路由到 Queue。
- AMQP (高级消息 Queue 协议): RabbitMQ 默认的消息协议。
- Users (用户): RabbitMQ 用户,拥有账号密码、权限、Vhost 权限等。
- Vhost (虚拟机): 在同一 RabbitMQ 中隔离应用程序的机制。Queue 和 Exchange 存在于虚拟机中,用户可以拥有一个或多个虚拟机权限。
PUB/SUB 流程
简要概括
- Producer 负责推送消息到 Exchange
- Consumer 负责消费 Queue 的消息
- Exchange 负责路由消息到 Queue
- Queue 负责存储消息等待消费
详细说明
Producer (生产者客户端):
- 创建一个 TCP 连接到 RabbitMQ
- 创建一个 Channel 用来发送消息
- 发送消息到 Exchange
Consumer (消费者客户端):
- 创建一个 TCP 连接到 RabbitMQ
- 创建一个 Channel 用来接收消息
- 向 RabbitMQ Broker 申明创建一个 Exchange
- 向 RabbitMQ Broker 申明绑定一个 Queue 到 Exchange
- 监听消费 Queue 中的消息
RabbitMQ Broker (RabbitMQ 服务端):
- 从 Consumer 接收申明指令创建 Exchange 和 绑定 Queue 到 Exchange
- Exchange 从 Producer 接收消息,路由到 Queue
Queue 参数解析
- Name 名称
- Durable 是否在 RabbitMQ 重启之后存在
- Exclusive 在只有一个连接的时候使用,并且 Queue 会在连接断开的时候删除
- Auto-delete 如果是 yes,Queue 将在最后一个 Consumer 取消、断开、消失的时候自动删除
- Arguments 可选,用于一些插件和 RabbitMQ 的功能所使用的参数
Queue 的类型
- Classic 常规类型
- Quorum 新的队列类型,适用于对数据安全、容错方面要求高于低延迟等其他特性的场景。
Quorum queues are purpose built by design. They are not designed to be used for every problem. Their intended use is for topologies where queues exist for a long time and are critical to certain aspects of system operation, therefore fault tolerance and data safety is more important than, say, low latency and advanced queue features.
Exchange 参数解析
- Name 名称
- Type 类型
- Durability 是否在 RabbitMQ 重启之后存在
- Auto-delete 是否在最后一个绑定的 Queue 解绑的时候删除
- Arguments 可选,用于一些插件和 RabbitMQ 的功能所使用的参数
- Internal: 默认 false,如果是 yes 则 Exchange 只能够在绑定的 Exchange 之间传递消息
Exchange 的类型
- Direct: 消息的 Routing key 和 Queue 的 Binding key 匹配一致, 消息会路由到对应的 Queue 中。
- Fanout: Fanout 模式的 Exchange 会发送消息给所有绑定的 Queue。
- Topic: Topic 模式的 Exchange 会对 Routing key 进行设定好的路由规则验证,路由消息到指定的一个或多个 Queue 中。
- Headers: 使用 Message header 的属性来作为路由参数。
常见问题
Q:推送消息的时候如何保证有对应的 Exchange 和 Queue?
A:Producer 和 Consumer 客户端处理这种问题的时候,双方都会向 RabbitMQ Broker 申明创建 Exchange 和 Queue 以保证消息传输过程通达。
Q:如何选择合适的模式?
A:在了解完 RabbitMQ Exchange 的特性之后,我们可以参考一些最佳实践来选择符合我们使用场景的类型。目前比较符合我们微服务结构下的 PUB/SUB 机制的类型是 Exchange Fanout。为什么选用这个模式,是因为这种类型的申明字段结构比较清晰,不容易因为复杂的路由规则而犯错,而且符合我们对 PUB/SUB 机制的理解。
版权归原作者 小猪@笨笨 所有, 如有侵权,请联系我们删除。