RabbitMQ 简介
RabbitMQ 是一款开源的消息中间件(Message Broker),实现了 AMQP 0-9-1 协议,用 Erlang 语言编写。它把"发消息的程序"与"处理消息的程序"解耦开:生产者只管把消息交给 RabbitMQ,消费者按自己的节奏取走,两边互不知道对方的存在。
为什么需要消息中间件
服务之间直接 HTTP 调用有三大痛点:服务 A 挂了服务 B 立刻失败(耦合紧)、慢操作阻塞请求(同步等待)、流量突增直接打垮下游(无缓冲)。消息中间件把"直接调用"改成"投递进消息系统",从而解决这三个问题:
| 解决的问题 | 说明 | 生活化例子 |
|---|---|---|
| 系统解耦 | 上下游只依赖 MQ,互不感知对方存在 | 下单服务不必知道短信、积分服务是否存在 |
| 异步提速 | 耗时操作放后台做,接口立刻返回 | 注册成功后异步发邮件,不用等邮件发完 |
| 削峰填谷 | 洪峰流量先入 MQ,下游按自身能力消费 | 秒杀订单先排队,再慢慢落库处理 |
RabbitMQ 核心特性
RabbitMQ 不是最简单的消息系统,却是路由最灵活、生态最完整的之一,常用特性:
| 特性 | 说明 |
|---|---|
| 可靠投递 | 发送方确认、消费方 ack、消息持久化,消息不容易丢 |
| 灵活路由 | 交换机 + 绑定 + routing key,一对一、一对多、多对多随心配置 |
| 集群高可用 | 支持集群、镜像/仲裁队列,单点故障可恢复 |
| 多协议多语言 | 原生 AMQP,另可启用 MQTT/STOMP 插件;官方客户端覆盖几乎所有语言 |
| 管理完善 | 网页控制台、HTTP API、监控指标齐全 |
典型应用场景
RabbitMQ 适合"业务消息"而非"海量日志流",常见用法如下:
| 场景 | 怎么用 |
|---|---|
| 异步通知 | 注册、下单后异步发短信/邮件/站内信 |
| 任务队列 | 图片处理、报表生成等耗时任务交给 worker 排队消费 |
| 事件分发 | 一条订单事件广播给库存、积分、搜索等多个服务 |
| 削峰 | 秒杀、抢购请求先写入 MQ,按下游吞吐量慢慢消费 |
| 轻量日志收集 | 各服务把日志推到交换机,按级别路由到不同队列 |
与其他消息中间件的关系
常被放在一起比较的三兄弟,一句话定位:
| 中间件 | 一句话定位 |
|---|---|
| RabbitMQ | 路由灵活、功能全面,适合业务消息、任务队列与 RPC |
| Kafka | 高吞吐、日志可重放,适合日志/事件流与大数据管道 |
| RocketMQ | 电商交易链路成熟,事务消息与削峰场景见长 |
大方向:追求超高吞吐与事件流选 Kafka,电商交易链路选 RocketMQ;业务解耦、灵活路由、要控制台好用的场景,RabbitMQ 是很稳的选择。
小结
RabbitMQ = 基于 AMQP 的消息中间件,核心价值是解耦、异步、削峰。下一章进入它的协议与消息模型,把交换机、队列、绑定这三件套弄明白,后面所有用法都建立在这套模型之上。