RabbitMQ 是一个实现了高级消息队列协议(AMQP)的消息中间件。
RabbitMQ 是完全免费的开源软件,由 Erlang 编写,用于在分布式系统中传递消息(Message),实现系统之间的解耦、异步通信、削峰限流等目标。
它可以帮助不同系统或模块通过消息进行通信,而不需要直接连接,比如:
-
微服务之间传递消息
-
后台任务异步执行
-
日志/事件收集与处理
-
消息通知系统(如短信、邮件)
RabbitMQ 的核心概念
概念 | 说明 |
---|---|
Producer(生产者) | 发送消息的一方 |
Consumer(消费者) | 接收消息的一方 |
Message(消息) | 数据本身,比如字符串、JSON、二进制等 |
Queue(队列) | 储存消息的地方,消费者从这里拿消息 |
Exchange(交换机) | 决定消息怎么分发到哪个队列 |
Binding(绑定) | 队列与交换机之间的绑定关系 |
Routing Key(路由键) | 帮助交换机决定把消息路由到哪个队列 |
Virtual Host(虚拟主机) | RabbitMQ 的多租户机制,可以隔离不同系统的队列和权限 |
RabbitMQ 的工作流程图
Producer
↓
[Exchange] —> [Queue A] —> Consumer A
↓
—> [Queue B] —> Consumer B
-
生产者把消息发送到交换机(Exchange);
-
交换机根据路由规则,把消息分发到一个或多个队列(Queue);
-
消费者监听队列,处理消息。
RabbitMQ 的优点
优点 | 说明 |
---|---|
✅ 开源免费 | 基于 Erlang 开发,稳定可靠 |
🔄 支持多种协议 | 支持 AMQP、MQTT、STOMP、HTTP |
📊 可视化管理界面 | 提供 Web UI,方便监控队列、交换机、消息情况 |
⏳ 可靠投递机制 | 支持消息确认(ACK)、持久化、重试 |
🧱 灵活的路由机制 | Direct、Fanout、Topic、Headers 四种交换机类型 |
🚀 高并发支持 | 可用于高吞吐量系统 |
🔒 安全性强 | 支持用户权限管理、虚拟主机隔离 |
💡 插件丰富 | 如延迟队列、Shovel(消息桥接)、集群管理等 |
RabbitMQ 常用的交换机类型
类型 | 功能 |
---|---|
Direct | 精准匹配 routing key,将消息路由到指定队列 |
Fanout | 广播模式,发给所有绑定的队列 |
Topic | 通配符匹配 routing key,适合复杂路由 |
Headers | 根据消息头属性分发,不看 routing key(较少用) |
RabbitMQ 使用场景示例
-
📬 用户注册后发送激活邮件(异步解耦)
-
📥 下单后发起支付请求并推送短信通知
-
🧮 高峰期请求排队(限流削峰)
-
🧾 订单状态变更通知多个微服务
-
📦 电商平台库存系统异步同步
RabbitMQ 常见端口说明
端口 | 功能 |
---|---|
5672 | AMQP 协议通信(默认) |
15672 | Web 管理后台 |
25672 | 集群节点通信 |
4369 | Erlang 分布式服务发现 |
RabbitMQ 队列的存储与持久化
-
RabbitMQ 队列和消息默认存储在内存中,这样性能快,但断开或重启 RabbitMQ 服务后,内存数据就会丢失。
-
消息队列是临时的、易失的,除非你做了持久化配置。
如何让队列和消息“关机后不消失”?
RabbitMQ 提供了两种持久化机制:
(1)队列持久化(Queue Durable)
-
声明队列时设置
durable=true
,表示队列是持久化的,RabbitMQ 重启后队列依然存在。
$channel->queue_declare(‘task_queue’, false, true, false, false);
(2)消息持久化(Message Persistent)
-
发送消息时设置消息属性
delivery_mode=2
,表示消息是持久化的,RabbitMQ 服务器重启后不会丢失这条消息。
$msg = new AMQPMessage(‘Hello’, array(‘delivery_mode’ => AMQPMessage::DELIVERY_MODE_PERSISTENT));
- 两者都设置,才能保证“关机后消息不丢失”
- 如果只设置队列持久化,但消息没设置持久化,重启后消息还是会丢失。
- 如果只设置消息持久化,但队列非持久化,重启后队列和消息都会丢失。