文章目录
- 一、docker安装
- [二、RabbitMQ 六种模式](#二、RabbitMQ 六种模式)
-
- [1. 简单模式(Simple Queue)](#1. 简单模式(Simple Queue))
- [2. 工作队列模式 (Work Queue)](#2. 工作队列模式 (Work Queue))
- [3. 发布/订阅模式(Publish/Subscribe)](#3. 发布/订阅模式(Publish/Subscribe))
- [4. 路由模式(Routing)](#4. 路由模式(Routing))
- [5. 主题模式(Topics)](#5. 主题模式(Topics))
- [6. RPC 模式(远程调用,不常用)](#6. RPC 模式(远程调用,不常用))
- [三、RabbitMQ 交换机类型](#三、RabbitMQ 交换机类型)
-
- [1. Fanout 交换机](#1. Fanout 交换机)
- [2. Direct 交换机](#2. Direct 交换机)
- [3. Topic 交换机](#3. Topic 交换机)
- [4. headers 交换机(不常用)](#4. headers 交换机(不常用))
- [5. x-local-random 交换机 (不常用)](#5. x-local-random 交换机 (不常用))
- 四、总结
参考文章:https://cloud.tencent.com/developer/article/1975744
参考视频: https://www.bilibili.com/video/BV1dX4y1V73G?spm_id_from=333.788.videopod.episodes\&vd_source=4085910f7c5c4dddcc04446ebf3aed6b\&p=18
一、docker安装
官网: https://www.rabbitmq.com/docs/download
创建文件夹
挂在数据目录
bash
mkdir -p /usr/local/docker_data/rabbitmq-data
挂在配置文件rabbitmq.conf
bash
mkdir -p /usr/local/docker_config
docker 命令
bash
docker run -d --hostname my-rabbit -v /usr/local/docker_config/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf -v /usr/local/docker_data/rabbitmq-data:/var/lib/rabbitmq --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:4-management
--hostname
必须指定
- 如果不指定 --hostname,Docker 会随机生成一个主机名(比如 a7b3c9d1e2f),对应的 RabbitMQ 数据目录就会是 /usr/local/docker_data/rabbitmq-data/mnesia/rabbit@a7b3c9d1e2f。
当容器重启或重建时,随机主机名会变,数据目录也会跟着变,原来的消息和配置就找不到了(相当于 "换了个数据文件夹")。 - 指定之后 此时 RabbitMQ 的数据目录会固定为 /usr/local/docker_data/rabbitmq-data/mnesia/rabbit@my-rabbit,即使容器重启,只要主机名不变,数据就能被正确读取。
二、RabbitMQ 六种模式

RabbitMQ 不论哪种模式推送消息都是: 生产者-->交换机-->队列-->消费者,简单和工作队列虽然图示虽然没有表明交换机的存在,但其使用的是默认交换机direct
1. 简单模式(Simple Queue)
适用场景
- 单一生产者 → 单一队列 → 单一消费者
- 最简单的消息传递,无路由逻辑
- 虽然图上没有体现交换机,但使用的默认交换机
direct
,因为RabbitMQ消息必须走交换机
Producer Queue Consumer
关键特性
- 队列自动创建,无需绑定交换器(实际隐式绑定到默认交换器 "")
- 消息默认轮询分发给消费者(若多个消费者监听同一队列)
2. 工作队列模式 (Work Queue)
适用场景
- 生产者 → 单队列 → 多个消费者竞争消费
- 任务分发、负载均衡(如耗时任务拆分)
- 虽然图上没有体现交换机,但使用的默认交换机
direct
,因为RabbitMQ消息必须走交换机
Producer Queue Consumer1 Consumer2
关键特性
- 消息默认轮询分发(Round-Robin)
- 可配置公平分发(Prefetch Count=1)
与简单模式的区别
- 消费者数量不同(工作队列允许多消费者)
3. 发布/订阅模式(Publish/Subscribe)
适用场景
- 1条消息需要广播给多个消费者
- 典型应用:日志广播、事件通知
Producer Fanout Exchange Queue1 Queue2 Consumer1 Consumer2
关键特性
- 使用
Fanout
交换器(消息广播到所有绑定队列) - 队列需显式绑定到交换器:
4. 路由模式(Routing)
适用场景
- 根据消息的 Routing Key 选择性投递
- 典型应用:按错误级别过滤日志
error info Producer Direct Exchange Queue1 Queue2 Consumer1 Consumer2 Consumer3
关键特性
- 使用
Direct
交换器 - 绑定队列时指定 Routing Key
- 其实也可以把路由模式的routing key 写成一样,就是发布订阅模式,
5. 主题模式(Topics)
适用场景
- 基于 通配符 的复杂路由规则
- 典型应用:消息分类(如:stock.us.nyse 或 weather.europe.fr)
*.critical system.* Producer Topic Exchange Queue1 Queue2 Consumer1 Consumer2
关键特性
- 使用
Topic
交换器 - Routing Key 支持通配符:
匹配1个单词(如 a.* 匹配 a.b 但不匹配 a.b.c)
匹配0或多个单词(如 a.# 匹配 a、a.b、a.b.c)
6. RPC 模式(远程调用,不常用)
适用场景
- 通过消息队列实现 请求-响应 交互
- 替代 HTTP 调用,实现解耦
请求 响应 Client Request Queue Server Reply Queue
关键特性
使用 回调队列(Reply-To)和 Correlation ID 匹配请求
工作中最常用的模式就是 工作队列模式
和 路由模式
,其余都略显鸡肋。
三、RabbitMQ 交换机类型
标题二是根据模式进行分类,但究其根本其模式的区别是根据交换机的不同决定的,所以下面从交换机进行分类。
目前常用的有三种类型:fanout、 direct、topic
1. Fanout 交换机
- 与
Fanout
交换机相关的模式只有发布/订阅模式(Publish/Subscribe)
。 - 其
不会处理路由键
,只要接收到消息,就广播到所有队列
上。fanout类型转发消息是最快的。
2. Direct 交换机
- 与 Direct 交换机相关的模式有:
简单模式(Simple Queue)
、工作队列模式 (Work Queue)
、路由模式(Routing)
这三种模式。 Direct
交换机 是在Fanout
交换机的基础增加了过滤条件routing key
,其不再像Fanout
一样无条件广播给所有队列,而是广播给同样 绑定了routing key
的队列。
3. Topic 交换机
- 与Topic交换机相关的模式只有
主题模式(Topics)
- Topic 交换机是在
Direct
交换机的基础上把确定的过滤条件变为类似与正则表达式(仅仅是类似) 的表达式相关的过滤。 -
- 其将路由键和绑定键的字符串切分成单词,这些单词之间用.隔开。它会识别两个通配符:
#
和*
,#
匹配0个或多个单词,*
匹配一个单词
- 其将路由键和绑定键的字符串切分成单词,这些单词之间用.隔开。它会识别两个通配符:
4. headers 交换机(不常用)
headers
交换机同样也是添加过滤条件,不过其不再是在routing key
上过滤,而是在队列参数上进行过滤,比如headers交换机设置了 参数x=1 的过滤条件,队列中的参数有x=1的才会接收到消息
5. x-local-random 交换机 (不常用)
暂无
四、总结
自己总结,仅供参考。
综上所述,入门RabbitMQ其实很简单,两个重要组件,交换机和队列,至于其模式都是根据交换机的延申处理的,交换机常用就三种,fanout、direct、topic ,而这三种的区别也仅仅是过滤级别的区别,fanout无过滤(广播),direct 路由key过滤(确定的字符串),topic 类似于正则的过滤。也类似于nginx的server中正则路径一样,/
/prod-api/
/*api/
或者也可以这样理解,RabbitMQ 的核心就是消息在 交换机
消息队列
之间的传递(在这块队列就可以直接与消费者抽象为一体)交换机只能有一个,队列可以1个或多个,所以问题就可以归纳为交换机和队列之间的关系。
- 在只有1个交换机,1个队列时 ,可以分为 简单模式(一个消费者)和工作队列模式(多个消费者,队列默认轮询分发消息)
- 在有1个交换机,多个队列时, 此时交换机给队列分发消息
是没有条件全部广播 (fanout 交换机, 发布订阅模式)?
还是根据过滤条件指定过滤具体字符串发给特定的交换机(direct 交换机,路由模式)?
还是根据过滤条件类似于正则匹配发给特定的交换机 (topic 交换机,主题模式)?
拓展说明
error info Producer Direct Exchange Queue1 Queue2 Consumer1 Consumer2 Consumer3
上图为路由模式,在路由模式下,Consumer1 和 Consumer3 订阅了同一个队列 Queue1,它们会以轮询
的方式接收 Queue1 中的消息,但不会同时收到同一条消息。这种机制有助于实现消息的负载均衡和并行处理。
也就是说
- 交换机--》队列 是根据交换机类型来分发消息的。
- 队列--》消费者 是轮询分发消息的。(默认轮询,可以更改为 公平分发 或 优先级队列)