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:额外可选参数(延迟交换机等插件参数)
相关推荐
starzy199017 小时前
SparkSQL 数据源与底层架构深度剖析
大数据·分布式·架构·spark
番茄炒鸡蛋加糖18 小时前
RabbitMQ 全套复盘 + Nacos+ES+MyBatis-Plus 梳理
分布式·rabbitmq
零域码客1 天前
从 SQLite 到 PostgreSQL:轻量单机到分布式架构选型、避坑与迁移全解析
分布式·postgresql·sqlite·wal·架构设计·后端开发·数据库选型
ltl1 天前
2PC 的真实失败模式:阻塞、脑裂与恢复
分布式
霸道流氓气质2 天前
分布式系统设计:技术解析与实践
分布式
画中有画2 天前
分布式锁架构方案选型与实践
分布式·架构
ACP广源盛139246256732 天前
蚂蚁百灵 Ling‑3.0‑flash 开源 + 昇腾 0‑Day 原生适配@ACP#GSV9001E 在国产算力矩阵中的机会与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
汽车仪器仪表相关领域2 天前
KRYPTON坚固型IP67 EtherCAT总线数据采集模块:工业级分布式采集方案
分布式·功能测试·汽车·压力测试·可用性测试
霸道流氓气质2 天前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式