Skip to main content
[ PIER ]

RabbitMQ

部署最广泛的开源消息代理。

Service #message-broker#amqp#queue#messaging#pubsub

RabbitMQ 是一个功能丰富的开源消息代理,实现 AMQP 0-9-1、MQTT、STOMP 和 RabbitMQ Streams 协议。它是解耦微服务、可靠后台任务、扇出 pub/sub 和复杂路由拓扑的首选。Pier 部署官方 Docker 镜像,启用管理 UI。

使用 Pier 部署

  1. 1 打开 Pier 控制台,点击 Add service。
  2. 2 从模板列表中选择 RabbitMQ。
  3. 3 选择版本、设置服务名称,Pier 会自动配置容器、存储和端口。
  4. 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。

代码示例

从 Python(pika)连接 python
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),
)
在 Node.js 中消费(amqplib) javascript
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 交换机路由 bash
# 声明一个 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.*"
死信重试模式 json
{
  "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?
5672/tcp 用于 AMQP,15672/tcp 用于管理 UI。Pier 暴露两者;附加域名通过 HTTPS 访问 UI。
默认凭据?
Pier 为 `admin` 用户(RABBITMQ_DEFAULT_USER / RABBITMQ_DEFAULT_PASS)生成强密码。在服务页面可见。
持久化?
是 — Pier 将 `/var/lib/rabbitmq` 挂载为持久卷。当队列为 `durable` 时,带 `delivery_mode=2`(持久)的消息在代理重启后存活。
集群?
RabbitMQ 集群需要共享 Erlang cookie + DNS 可发现节点 — 超出单容器模板范围。对于 HA,在单节点上使用 quorum 队列,或构建自定义多节点模板。
内存限制?
RabbitMQ 使用 `RABBITMQ_VM_MEMORY_HIGH_WATERMARK`(默认 0.4 = 系统 RAM 的 40%)在内存低时节流生产者。如果容器内存受限,通过 env 调整。
Pier 部署哪个版本?
默认 `latest`(RabbitMQ 4.x)。`3-management` 和 `4-management` 是包含管理 UI 插件的固定变体。
备份?
对于队列定义 + 用户 + 策略 — `rabbitmqctl export_definitions` 到 JSON,在 Git 中版本化。对于实际消息数据,你通常不备份 — 将队列设计为瞬态状态。

相关服务

在你的 VPS 上部署

RabbitMQ 是一个功能丰富的开源消息代理,实现 AMQP 0-9-1、MQTT、STOMP 和 RabbitMQ Streams 协议。它是解耦微服务、可靠后台任务、扇出 pub/sub 和复杂路由拓扑的首选。Pier 部署官方 Docker 镜像,启用管理 UI。

部署此服务 →