1. 核心概念
1.1 工作模型

Connection(连接)
客户端与 RabbitMQ Broker 之间建立的一条 TCP 连接。
- 创建 TCP 连接成本很高:三次握手、分配服务端资源、端口占用。
- 如果每发送一条消息就新建一个 TCP 连接,高并发场景下会造成:端口耗尽、MQ 压力巨大、性能严重下降。
Channel(信道)
java
1.如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立 TCP 连接的开销将是巨大的,效率也较低,在系统访问流量高峰时,会严重影响系统性能。
2.Channel(信道)是在Connection内部建立的逻辑连接
如果应用程序支持多线程,通常每个线程创建单独的channel进行通讯, channel 之间是完全隔离的。
Channel作为轻量级的Connection 极大减少了操作系统建立TCP connection的开销 。
在已经存在的一条 TCP Connection 内部,开辟出来的多条独立的逻辑通道。
- 一条 TCP 连接,可以创建成百上千个 Channel。
- Channel 之间完全隔离,互不影响。
- Channel 的创建销毁开销极小,不需要新建 TCP。
RabbitMQ 所有业务操作:声明交换机、声明队列、绑定、发消息、消费消息、ACK 确认,全部都要在 Channel 上完成。
java
一句话总结:
Connection = TCP 物理连接
Channel = TCP 连接里面的会话 / 虚拟管道
java
Client
|
TCP Connection(1条物理连接)
|
┌──────┴──────┬──────┴──────┐
Channel1 Channel2 Channel3
发订单消息 发支付消息 消费日志消息
Broker
java
Broker 就是 RabbitMQ 的消息服务器实例本身,是接收、存储、路由、转发消息的独立服务进程。
Broker 内部包含哪些组件
java
Broker
└── vhost(虚拟主机,可以多个)
├── Exchange 交换机
├── Queue 队列
├── Binding 绑定关系
├── 用户、权限
└── 消息数据
注意:Connection、Channel 不属于 Broker。
Virtual host(虚拟主机)
java
1.Virtual host是一个虚拟主机的概念,一个Broker中可以有多个虚拟主机。
2.Virtual‑Host(虚拟主机 / 虚拟域)是 Broker 内部一套独立的逻辑隔离环境。
类比理解:
- Broker ≈ 一台 MySQL 数据库服务器
- vhost ≈ MySQL 里面的 database(数据库库)
3.一个 Broker 可以创建多个 vhost;不同 vhost 的交换机、队列、绑定关系完全隔离、互不可见、互不干扰。
RabbitMQ 安装完成后自带一个默认虚拟主机:`/`
Virtual host 里面包含哪些资源?
在某一个 vhost 下,拥有一套独立完整资源:
- Exchange(交换机)
- Queue(队列)
- Binding(交换机‑队列绑定关系)
- 权限配置:哪些用户可以访问这个 vhost
java
❗重点:**交换机、队列是属于某个 vhost 的,不是属于整个 Broker**。
在 vhost‑A 创建的队列 `order_queue`,在 vhost‑B 看不到,也不能访问。
Virtual host 核心作用
1. 资源隔离(最主要用途)
同一套 RabbitMQ 集群给多个项目 / 多个环境共用时,使用 vhost 隔离。
示例场景:
一台 RabbitMQ 服务同时给三个项目使用
- vhost‑dev:开发环境
- vhost‑test:测试环境
- vhost‑prod:生产环境
开发环境的队列不会跑到测试环境,即使队列名字完全一样,也互不冲突。
2. 权限管控
可以给不同用户分配不同 vhost 的访问权限。
示例:
- 用户 dev_user 只能登录
vhost‑dev,不能访问生产 vhost - 管理员账号可以访问全部 vhost
权限粒度:对某个 vhost,配置用户的 configure、write、read 权限。
- configure:声明 / 删除交换机、队列的权限
- write:发送消息权限
- read:消费消息、ACK 的权限
3. 多租户
一套 RabbitMQ 集群供给多个业务团队使用,每个团队分配独立 vhost,实现多租户隔离。
Exchange(交换机)
java
Exchange 是 Broker(MQ 服务端)内部,负责接收生产者消息、然后按照路由规则把消息分发到队列的路由组件。
交换机资源属于某一个 vhost(虚拟主机),不同 vhost 下同名交换机互不干扰。
java
一条黄金规则:
生产者永远不会直接把消息发送到队列。生产者只能发送消息到交换机。
再由交换机,把消息路由到一个或者多个 Queue。
交换机本身默认不存储消息!
- 交换机只做转发路由;
- 消息最终存储在队列;
- 只有开启延迟消息插件 时,延迟交换机才会临时持有消息。
消息投递完整链路
java
生产者 → Exchange (交换机) → Binding (绑定) → Queue (队列) → 消费者
交换机四大基础属性
- Name 交换机名称
- Type 交换机类型(Direct / Fanout / Topic / Headers),决定路由匹配规则
- Durable 是否持久化
- true:交换机元数据持久化,MQ 重启后交换机还存在
- false:临时交换机,Broker 重启就消失
- Auto‑delete 是否自动删除
- true:当最后一个和它绑定的队列解绑之后,交换机自动被删除
- Arguments:额外可选参数(延迟交换机等插件参数)