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

相关推荐
重庆小透明19 小时前
带你从不同视角了解三大MQ
java·学习·spring·kafka·rabbitmq·rocketmq
珠***格21 小时前
分布式光伏电站:四可装置如何实现 “可观、可测、可控、可调”
网络·人工智能·分布式·架构·能源
晚安code1 天前
RabbitMQ消息可靠性:发送确认、消费者ACK与SpringAMQP实战
rabbitmq
L1624761 天前
消息队列(MQ)总览:RabbitMQ & Kafka 完整手册
分布式·kafka·rabbitmq
fīɡЙtīиɡ ℡1 天前
分布式ID生成策略
java·分布式·算法
肥胖小羊1 天前
企业微信应用的 Token 缓存策略与分布式锁高可用设计
分布式·缓存·企业微信
栩栩云生1 天前
被抹去的 27 秒:你的代码,其实并不活在真实的时间里
分布式·unix
流烟默1 天前
分布式限流三种方案详解
分布式·网关限流
刘小八1 天前
RabbitMQ 消息积压排查:从指标定位到消费者扩容
分布式·rabbitmq
风样滴男人哟1 天前
基于 .NET 开源、功能齐全的分布式作业调度系统
分布式·开源·.net