3 RabbitMQ基础

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,配置用户的 configurewriteread 权限。

  • configure:声明 / 删除交换机、队列的权限
  • write:发送消息权限
  • read:消费消息、ACK 的权限
3. 多租户

一套 RabbitMQ 集群供给多个业务团队使用,每个团队分配独立 vhost,实现多租户隔离。

Exchange(交换机)

java 复制代码
Exchange 是 Broker(MQ 服务端)内部,负责接收生产者消息、然后按照路由规则把消息分发到队列的路由组件。
交换机资源属于某一个 vhost(虚拟主机),不同 vhost 下同名交换机互不干扰。
java 复制代码
一条黄金规则:
生产者永远不会直接把消息发送到队列。生产者只能发送消息到交换机。
再由交换机,把消息路由到一个或者多个 Queue。

交换机本身默认不存储消息

  • 交换机只做转发路由;
  • 消息最终存储在队列;
  • 只有开启延迟消息插件 时,延迟交换机才会临时持有消息。

消息投递完整链路

java 复制代码
生产者 → Exchange (交换机) → Binding (绑定) → Queue (队列) → 消费者

交换机四大基础属性

  1. Name 交换机名称
  2. Type 交换机类型(Direct / Fanout / Topic / Headers),决定路由匹配规则
  3. Durable 是否持久化
    • true:交换机元数据持久化,MQ 重启后交换机还存在
    • false:临时交换机,Broker 重启就消失
  4. Auto‑delete 是否自动删除
    • true:当最后一个和它绑定的队列解绑之后,交换机自动被删除
  5. Arguments:额外可选参数(延迟交换机等插件参数)
相关推荐
stark张宇1 小时前
分布式事务最全图解(6种方案):从强一致的2PC到最终对账,彻底搞懂数据一致性
分布式·后端
会周易的程序员1 小时前
5Draft使用说明书
服务器·c++·分布式·raft·共识
富士康质检员张全蛋1 小时前
Kafka实战 自定义分区器 几种常见的分区器
分布式·kafka
努力努力再努力wz2 小时前
【Redis入门系列】:从 RESP 协议到 redis-plus-plus:Redis 客户端编程与 C++ 接口设计
开发语言·数据库·c++·redis·分布式·缓存·架构
Dreams_l2 小时前
RabbitMQ在SpringBoot中的应用
spring boot·rabbitmq·java-rabbitmq
青禾8372 小时前
Git 与 SVN 完全指南:从集中式到分布式的版本控制
分布式·git·svn
2301_800954993 小时前
Git 版本控制核心概念详解:从集中式到分布式
分布式·git
天天喝旺仔3 小时前
gRPC 流式通信实战:从一元调用到双向流,吃透四种 RPC 模式(Go 版)
分布式·http·微服务·rpc·go
明达智控技术18 小时前
告别停机内卷!热插拔远程IO,解锁工控运维新范式
分布式·物联网·自动化
漂着的圆木19 小时前
MCP 2026-07-28 长任务改造:别再用 HTTP 超时判断任务失败
分布式·架构·状态模式·ai agent