rabbitmq 的多用户、多vhost使用

参考来源与基础权限:

Authentication, Authorisation, Access Control | RabbitMQ

四大用户tag:managementUser can access the management plugin

policymakerUser can access the management plugin and manage policies and parameters for the vhosts they have access to.

monitoringUser can access the management plugin and see all connections and channels as well as node-related information.

administratorUser can do everything monitoring can do, manage users, vhosts and permissions, close other user's connections, and manage policies and parameters for all vhosts.

推荐角色
management (基础管理权限)+ 自定义权限(限制对特定资源的访问)。

  1. policymaker

    适用于需要管理策略(如消息过期、镜像队列)的运维人员,但不建议直接分配给生产者或消费者。

  2. monitoring

    适用于监控系统(如 Prometheus、Grafana),可查看所有连接和节点信息。

  3. administrator

    仅用于系统管理员,拥有最高权限,不适合生产者 / 消费者。

最佳实践

  1. 为不同业务创建独立用户

    例如,订单系统和库存系统应使用不同的用户,避免权限交叉。

  2. 使用虚拟主机(Vhost)隔离环境

    为开发、测试、生产环境创建独立的 Vhost,并分配不同用户。

STOMP 支持多个不同的目标,包括那些假定预先存在的拓扑的目标。

  • /topic:发布到没有使用者的主题将导致消息丢失。第一个订阅者 该主题将为其声明一个队列。
  • /exchange:目标交易所必须存在,否则服务器将报告错误
  • /amq/queue:目标队列必须存在,否则服务器会报错
  • /queue:发布到不存在的队列会设置它
  • /temp-queue:发布到不存在的临时队列会设置

七种工作模式介绍:

RabbitMQ 七种工作模式介绍-腾讯云开发者社区-腾讯云

典型场景示例

场景 1:多生产者并发写入同一 vhost

bash 复制代码
# 创建两个生产者用户,分别访问不同交换机
rabbitmqctl set_permissions -p my_vhost producer1 ".*" "order_exchange" ".*"
rabbitmqctl set_permissions -p my_vhost producer2 ".*" "inventory_exchange" ".*"
  • 结果producer1producer2 可以同时向 my_vhost 内的不同交换机发送消息。

场景 2:多消费者并发读取同一队列

bash 复制代码
# 创建两个消费者用户,访问同一队列
rabbitmqctl set_permissions -p my_vhost consumer1 "work_queue" ".*" "work_queue"
rabbitmqctl set_permissions -p my_vhost consumer2 "work_queue" ".*" "work_queue"

结果consumer1consumer2 可以通过竞争消费模式(Round-Robin)从 work_queue 获取消息,实现负载均衡。

场景 3:生产者与消费者协作

bash 复制代码
# 生产者权限:仅可发布到 order_exchange
rabbitmqctl set_permissions -p my_vhost producer ".*" "order_exchange" ".*"

# 消费者权限:仅可消费 order_queue
rabbitmqctl set_permissions -p my_vhost consumer "order_queue" ".*" "order_queue"
  • 结果 :生产者发布的消息通过 order_exchange 路由到 order_queue,消费者从队列获取消息,两者互不干扰。

**案例:**A B C三个设备 通过rabbitmq发送数据给服务1;D F两个设备通过同一个rabbitmq 发送数据给服务2。方案1:选择使用不同/vhost 对应不同服务,方案2:使用同一个/vhost 发布到不同交换机,由服务自己确认读取对应的队列 哪种好 ?

|--------|-------------------------------------------|-------------------------------------|
| 维度 | 方案 1:多 vhost(推荐) | 方案 2:单 vhost + 多交换机 |
| 资源隔离性 | 完全隔离:不同 vhost 拥有独立的用户、交换机、队列、连接。 | 逻辑隔离:所有资源共享同一 vhost,故障可能相互影响。 |
| 资源隔离性 | 一个 vhost 崩溃不影响其他 vhost。 | 逻辑隔离:所有资源共享同一 vhost,故障可能相互影响。 |
| 权限管理 | 清晰:用户权限基于 vhost 划分,如: | 复杂:需通过正则表达式精确控制用户对交换机 / 队列的访问,如: |
| 权限管理 | - 用户 robot_A 仅能访问 vhost_service1 | - 用户 robot_A 仅能访问 service1_* 交换机 |
| 权限管理 | - 用户 robot_D 仅能访问 vhost_service2 | |
| 监控与运维 | 简单:每个 vhost 可独立监控和维护,管理界面清晰分离。 | 复杂:所有设备和服务的指标混合,难以快速定位问题。 |
| 网络开销 | 每个 vhost 需单独建立连接,增加少量开销(通常可忽略)。 | 所有设备共享同一连接,开销略低。 |
| 安全风险 | 低:用户无法跨 vhost 访问资源,如服务 1 的设备无法访问服务 2 的数据。 | 高:若权限配置不当(如用户误配正则),可能导致数据泄露。 |
| 扩展性 | 好:新增服务只需创建新 vhost,无需修改现有配置。 | 一般:需在现有 vhost 内新增交换机 / 队列,可能影响现有路由。 |
| 配置复杂度 | 中等:需为每个 vhost 配置独立的用户和权限。 | 高:需精心设计交换机 / 队列命名规则和权限正则。 |

相关推荐
小坏讲微服务1 天前
Spring Boot 4.0 与 Spring Cloud Alibaba 2025 整合完整指南
java·spring boot·分布式·后端·spring cloud·微服务·架构
数智化架构师-Aloong1 天前
⚡️ PowerJob深度解析:Java生态下高并发分布式调度的终极选择
java·开发语言·分布式·系统架构
a***59261 天前
RabbitMQ高级特性----生产者确认机制
分布式·rabbitmq
LDG_AGI1 天前
【推荐系统】深度学习训练框架(六):PyTorch DDP(DistributedDataParallel)数据并行分布式深度学习原理
人工智能·pytorch·分布式·python·深度学习·算法·spark
BD_Marathon1 天前
【Zookeeper】Zookeeper内部的数据模型
linux·分布式·zookeeper
w***z501 天前
分布式多卡训练(DDP)踩坑
分布式
h***59331 天前
分布式与集群,二者区别是什么?
分布式
lucky_syq1 天前
深入Spark核心:Shuffle全剖析与实战指南
大数据·分布式·python·spark
GIOTTO情1 天前
技术深度拆解:Infoseek 媒体发布系统的分布式架构与自动化实现
分布式·架构·媒体
一个帅气昵称啊1 天前
在.NET中如何优雅的使用DotNetCore.CAP实现分布式事务,事件总线和消息最终一致性
分布式·微服务·.net