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,配置用户的 configure、write、read 权限。

  • 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:额外可选参数(延迟交换机等插件参数)
相关推荐
Thomas.Sir4 天前
第21课:PyTorch|GPU多卡训练与分布式训练基础【让多卡并行成为你的加速引擎】
人工智能·pytorch·分布式
Cicada1285 天前
库存消息消费的正确性设计——从幂等窗口到批量流水线
分布式·系统架构
Y3815326625 天前
Ruby 调用谷歌搜索 API:net/http 与 json 标准库实战
搜索引擎·ruby
Francek Chen5 天前
【大数据处理与分析】数据仓库Hive:04 数据仓库Hive概述
大数据·数据仓库·hive·hadoop·分布式
Gl�ria6 天前
Hadoop/YARN 集群缩容:下线DN节点
大数据·hadoop·分布式
吉甫作诵6 天前
Kafka 集群安装与运维实战:消费组排查、Offset 重置与副本重分配
大数据·运维·分布式·kafka·消息队列
imDwAaY6 天前
消息队列四大核心问题:顺序性、幂等性、可靠性与一致性
学习·kafka·rabbitmq
是Dream呀6 天前
Harness 工程:让 Agent 真正把任务做完
人工智能·分布式·缓存·agent
yt004yt6 天前
绿岛数字化平台搭建:VOCs 监测与能碳数据一体化方案
大数据·分布式