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 配置独立的用户和权限。 | 高:需精心设计交换机 / 队列命名规则和权限正则。 |

相关推荐
♛小小小让让2 小时前
RabbitMQ (二)参数
笔记·python·rabbitmq
理智的煎蛋7 小时前
基于 Celery 的分布式文件监控系统
redis·分布式·python·mysql·mongodb
失散1310 小时前
分布式专题——22 Kafka集群工作机制详解
java·分布式·云原生·架构·kafka
Lansonli12 小时前
大数据Spark(六十五):Transformation转换算子groupByKey和filter
大数据·分布式·spark
拾忆,想起12 小时前
RabbitMQ死信交换机:消息的“流放之地“
开发语言·网络·分布式·后端·性能优化·rabbitmq
沐浴露z13 小时前
一篇文章入门RabbitMQ:基本概念与Java使用
java·分布式·rabbitmq
失散1313 小时前
分布式专题——24 Kafka功能扩展
java·分布式·云原生·架构·kafka
从零开始学习人工智能14 小时前
分布式 WebSocket 架构设计与实现:跨节点实时通信解决方案
分布式·websocket·网络协议
qyt198852014 小时前
Python脚本(Kafka生产者+消费者)
分布式·kafka
caibixyy1 天前
Spring Boot 整合 Redisson 实现分布式锁:实战指南
spring boot·分布式·后端