RabbitMQ
部署最广泛的开源消息代理。
RabbitMQ 是一个功能丰富的开源消息代理,实现 AMQP 0-9-1、MQTT、STOMP 和 RabbitMQ Streams 协议。它是解耦微服务、可靠后台任务、扇出 pub/sub 和复杂路由拓扑的首选。Pier 部署官方 Docker 镜像,启用管理 UI。
使用 Pier 部署
- 1 打开 Pier 控制台,点击 Add service。
- 2 从模板列表中选择 RabbitMQ。
- 3 选择版本、设置服务名称,Pier 会自动配置容器、存储和端口。
- 4 如需 HTTPS,请绑定域名。Traefik 会自动签发 Let's Encrypt 证书。
什么是 RabbitMQ?
RabbitMQ 是部署最广泛的开源消息代理。2007 年起源于 Rabbit Technologies (后被 Pivotal 收购,现在是 Broadcom 的一部分),它实现 AMQP 0-9-1 作为主要 协议,并通过插件添加 MQTT、STOMP 和 RabbitMQ Streams。Mozilla、Reddit、 Cisco、NASA、AT&T 和数万其他组织在生产中运行它。
“智能代理”模型意味着 RabbitMQ 处理路由、扇出、重试、TTL、死信、优先级 — 这些功能在 RabbitMQ 中是服务器端的,而在 Kafka 中是客户端的。对于任务队列、 微服务解耦、webhook 投递和 IoT MQTT 桥接,RabbitMQ 通常在简洁性和人体 工程学上胜过 Kafka。
Pier 如何部署它
Pier 使用带 :management 标签的官方 rabbitmq Docker 镜像,包括 Web UI
插件。默认端口是 5672(AMQP)和 15672(管理 UI)。数据卷挂载到
/var/lib/rabbitmq — 队列状态、定义、消息存储都在那里。
Pier 自动生成 admin 用户密码。对于管理 UI,在 Pier 的 Domains 标签中
附加域名,Traefik 将流量路由到端口 15672。
客户端应用的连接字符串:amqp://admin:password@host:5672/。
何时不要使用 RabbitMQ
对于具有回放需求的高吞吐量事件流 — Apache Kafka。对于不需要持久性的瞬态 pub/sub — Redis pub/sub。对于超轻量云原生消息 — NATS。RabbitMQ 是你需要 具有丰富路由、重试和运维成熟度的功能丰富代理时的默认选择。
核心功能
多协议
AMQP 0-9-1(主要)、MQTT(IoT)、STOMP(Web 消息)和 RabbitMQ Streams(类 Kafka 日志)。一个代理,多种客户端。
丰富的交换机类型
Direct、fanout、topic、headers、consistent-hash 交换机。从简单 pub/sub 到每租户分片构建任何路由模式。
管理 UI + HTTP API
队列、交换机、绑定、连接、通道、用户、vhost 的 Web UI。每个 UI 操作都有 HTTP API 等价物 — 非常适合自动化。
Quorum 队列
基于 Raft 的复制队列用于高可用性场景。在节点故障中存活,无需手动镜像策略。
每消息 TTL 和死信交换机
内置支持过期消息、重试队列和死信路由。无需外部 retry-with-backoff 管道。
灵活的消费者模式
竞争消费者、独占消费者、优先级队列、惰性队列(用于巨大积压)、消费者取消通知。
应用场景
后台作业处理
将 HTTP 请求处理与慢工作解耦。任何语言的 worker 从 RabbitMQ 拉取 — Celery(Python)、Sidekiq(Ruby)、Bull(Node)、Hangfire(.NET)。
微服务解耦
服务 A 发布事件;服务 B 和 C 独立消费。Topic 交换机 + 每服务队列让你添加订阅者而无需更改发布者。
可靠扇出 / 事件广播
领域事件广播到多个订阅者 — 分析、审计日志、通知服务、缓存失效器 — 每个有自己的队列。
IoT MQTT 代理
设备通过 MQTT 发布遥测;后端服务通过 AMQP 消费。RabbitMQ 无缝桥接两种协议。
带重试的 Webhook 投递
入站 webhook → RabbitMQ 队列 → worker 以指数退避(通过死信重试队列)投递到用户定义的 URL。
代码示例
import pika
conn = pika.BlockingConnection(
pika.URLParameters("amqp://admin:password@rabbitmq:5672/")
)
ch = conn.channel()
ch.queue_declare(queue="emails", durable=True)
ch.basic_publish(
exchange="",
routing_key="emails",
body='{"to": "[email protected]", "tpl": "welcome"}',
properties=pika.BasicProperties(delivery_mode=2),
) import amqp from "amqplib";
const conn = await amqp.connect("amqp://admin:password@rabbitmq:5672/");
const ch = await conn.createChannel();
await ch.assertQueue("emails", { durable: true });
await ch.prefetch(10);
ch.consume("emails", (msg) => {
const job = JSON.parse(msg.content.toString());
sendEmail(job).then(() => ch.ack(msg));
}); # 声明一个 topic 交换机
rabbitmqadmin declare exchange name=events type=topic durable=true
# 服务 A 绑定到所有 'order.*' 事件
rabbitmqadmin declare queue name=orders-svc-q durable=true
rabbitmqadmin declare binding source=events destination=orders-svc-q \
routing_key="order.*" {
"queue": "tasks",
"arguments": {
"x-dead-letter-exchange": "tasks-dlx",
"x-dead-letter-routing-key": "retry"
}
} 对比
| vs Apache Kafka | Kafka 是仅追加日志 — 高吞吐量、回放友好、需要 Zookeeper 或 KRaft。RabbitMQ 是智能代理 — 灵活路由、较低吞吐量、操作更简单。规模化事件流选 Kafka;任务队列和微服务消息选 RabbitMQ。 |
| vs Redis pub/sub 和 Streams | Redis 是内存、简单、快速。Redis Streams 接近 Kafka 语义;Redis pub/sub 是即发即弃。RabbitMQ 在持久性保证、路由灵活性和集群上胜出。 |
| vs NATS | NATS 是基于 Go 的超轻量级消息。适用于云原生微服务。RabbitMQ 有更多功能、更多客户端、更多运维成熟度。 |
| vs Amazon SQS / Cloud Pub/Sub | 托管云队列 — 简单、无运维、供应商锁定。RabbitMQ 自托管,功能丰富。在零运维和完全控制之间权衡。 |
常见问题
默认端口和管理 UI?
默认凭据?
持久化?
集群?
内存限制?
Pier 部署哪个版本?
备份?
相关服务
在你的 VPS 上部署
RabbitMQ 是一个功能丰富的开源消息代理,实现 AMQP 0-9-1、MQTT、STOMP 和 RabbitMQ Streams 协议。它是解耦微服务、可靠后台任务、扇出 pub/sub 和复杂路由拓扑的首选。Pier 部署官方 Docker 镜像,启用管理 UI。
部署此服务 →