RabbitMQ

作者admin

7月 7, 2025

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));

  • 两者都设置,才能保证“关机后消息不丢失”
  • 如果只设置队列持久化,但消息没设置持久化,重启后消息还是会丢失。
  • 如果只设置消息持久化,但队列非持久化,重启后队列和消息都会丢失。

 

 

作者 admin

百度广告效果展示