简单介绍
整个消息队列中大体分为,生产者、队列、消费者,生产者负责创建消息,并存储到队列当中,消费者负责从队列中获取消息(消费)。
中间会有一些机制
- 消息的路由机制,将消息存储到哪个队列当中
- 消息的订阅
- 消费者获取消息的方式(push、pull)
- 消息是否成功消费
核心优势
- 解耦: 生产者和消费者之间不需要直接通信,只需知道交换机。
- 异步: 生产者发送消息后可以立即继续其他工作,无需等待消费者处理。
- 削峰: 在高并发场景下,消息队列可以作为缓冲区,平衡生产者和消费者的速度差异。
RabbitMQ 的工作流程原理
1. 生产者 (Producer):
负责发送消息到 RabbitMQ 交换机 (Exchange)。
2. 交换机 (Exchange):
接收来自生产者的消息。决定将消息转发到哪些队列。
RabbitMQ 提供了几种内置的交换机类型:
- Direct (直连交换机): 根据消息的路由键与绑定键 (Binding Key) 是否完全匹配来决定将消息发送到哪个队列。一个队列通过一个绑定键绑定到交换机上。
- Fanout (扇形交换机): 将收到的所有消息广播到所有绑定到该交换机的队列,忽略消息的路由键。适用于广播场景。
- Topic (主题交换机): 根据消息的路由键与绑定键的模式匹配来决定将消息发送到哪些队列。绑定键可以使用通配符 # (匹配零个或多个词) 和 * (匹配一个词)。适用于日志分发、复杂路由等场景。
- Headers (头交换机): 根据消息的 header 属性而不是路由键进行匹配(较少用)。
3. 队列 (Queue):
存储消息,消息在被消费者取走之前保存在队列中。一个队列可以被多个消费者订阅,但一条消息只能被一个消费者成功获取和处理(非广播模式下)。
4. 消费者 (Consumer):
从订阅队列中获取并处理消息。
消费者有两种获取消息的方式:推 (Push) 模式-将消息推给消费者和拉 (Pull) 模式-消费者主动从队列拉取消息)。
消费者处理完消息后,会发送确认给 RabbitMQ,告知消息已成功处理,RabbitMQ 便删除队列中的消息。
如果消费者没有确认(例如处理失败或崩溃),RabbitMQ 会将消息重新投递给其他消费者或自己。
5. 消息 (Message):
由消息头 (Headers) 和消息体 (Body) 组成。 消息头包含各种属性,如路由键 (Routing Key)、发送时间、优先级、是否持久化等。
队列模式
- 简单模式:做最简单的事情,一个生产者对应一个消费者,RabbitMQ 相当于一个消息代理,负责将 A 的消息转发给 B
- 工作队列模式(Work queues):在多个消费者之间分配任务(竞争的消费者模式),一个生产者对应多个消费者,一般适用于执行资源密集型任务,单个消费者处理不过来,需要多个消费者进行处理
- 订阅模式(Publish/Subscribe):一次向许多消费者发送消息,一个生产者发送的消息会被多个消费者获取,也就是将消息将广播到所有的消费者中。
- 路由模式(Routing):有选择地(Routing key)接收消息,发送消息到交换机并且要指定路由 key ,消费者将队列绑定到交换机时需要指定路由 key,仅消费指定路由 key 的消息
- 主题模式(Topics)
- 远程过程调用(RPC)
- 发布者确认(Publisher Confirms)