中间件速查手册
消息队列 · rabbitmq

RabbitMQ

路由最灵活的经典消息队列,业务解耦的第一选择

消息队列MPL-2.0Erlang学习难度:入门

RabbitMQ 是最“像邮局”的消息队列:生产者不直接把信送到收件人手里,而是交给交换机(Exchange),交换机按规则把信分到不同信箱(Queue)。灵活的路由规则是它最大的特点,也因此特别适合业务系统之间做解耦。

01

它解决什么问题

一个支付成功事件,风控要同步一份、积分要加、短信要发、数据组要统计。直接调四家接口,任何一家挂了都会影响支付主流程。

真实场景:典型场景:支付服务把消息发给一个 topic 类型的 Exchange,路由键是 pay.success,风控、积分、通知三个队列各自绑定自己关心的规则,谁挂了都不影响支付。

02

核心概念

每个概念一句话 + 一个类比。点击卡片看更详细的解释。

03

数据流转动画

跟着步骤看一条数据从进入系统到被处理完的完整路径,可以暂停、重播和调速。

Flow animation

Exchange 的三种路由方式

ProducerroutingKeyExchange交换机Queue Aorder.payQueue Border.*Queue C# 全部Consumer推模式

← 左右滑动查看完整流程图 →

01 / 05
1. 发布消息

生产者把消息发到 Exchange,带上 routingKey=order.pay。

提示:Direct 精确匹配、Topic 通配匹配、Fanout 无视路由键全部广播。 悬停图中的节点可以看概念解释。

04

优劣势

短句说清适合什么、不适合什么,选型时先看这一栏。

适合什么
  • 路由能力最强,Direct/Topic/Fanout/Headers 四种交换机
  • 开箱即用,管理界面友好,入门成本最低
  • 支持消息优先级、TTL、死信队列
  • 多语言客户端成熟
不适合什么
  • 吞吐量只有万级,远低于 Kafka
  • 消息堆积时性能下降明显(内存优先)
  • Erlang 技术栈,出问题排查门槛高
  • 集群队列的镜像同步在高堆积下容易抖动
05

常见使用场景

每个场景都配一句「为什么用它」。

01

业务系统解耦

支付成功后广播给积分、通知、风控,各自订阅。

为什么用它:Fanout/Topic 加队列绑定,新增下游只加一个队列。

02

延迟任务与重试

下单 30 分钟未支付关单;消费失败进死信队列人工处理。

为什么用它:TTL + 死信队列组合可以实现延迟和重试。

03

任务分发

图片转码、报表生成这类耗时任务,丢进队列让 worker 慢慢做。

为什么用它:一条消息只被一个 worker 消费,天然适合任务队列。

06

同类对比

和同赛道的组件并排看,差异一目了然。

KafkaRocketMQRabbitMQ

一句话:吞吐选 Kafka,业务语义选 RocketMQ,路由灵活和轻量选 RabbitMQ。三者不是替代关系,很多公司同时用两个。

打开对比页
07

常见问题

上手第一个月最容易卡住的地方。

Q1四种 Exchange 有什么区别?

Direct 按 routingKey 精确匹配;Topic 支持 * 和 # 通配;Fanout 忽略 key 广播给所有绑定队列;Headers 按消息头键值匹配,性能差、很少用。

Q2消息堆积怎么办?

先加消费者(不能超过队列数),再考虑拆分队列;开启 lazy queue 让消息直接落盘;极端情况临时扩容节点。根本办法是提高消费速度或限流生产端。

Q3和 Kafka 选哪个?

要百万级吞吐、日志流处理选 Kafka;要灵活路由、低延迟、业务解耦、消息优先级选 RabbitMQ。业务消息量不大时,RabbitMQ 更省心。

Q4消息丢失可能发生在哪?

三处:生产者没开 confirm、Exchange 没有绑定队列、消费者自动 ACK 但处理失败。对应解法:开启 publisher confirm + mandatory、声明持久化队列、改手动 ACK。

Q5Channel 和 Connection 的关系?

一个 Connection 是一条 TCP 连接,一个 Channel 是连接内的逻辑会话。频繁建连接开销大,所以复用 Connection、每个线程用自己的 Channel。Channel 不是线程安全的。