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

相关推荐
我登哥MVP1 天前
Hadoop成长史-从Nutch子项目到大数据生态王者
java·大数据·hadoop·分布式·云原生·云计算
Rain的Java大神实战圈1 天前
订单超时如何自动取消
消息队列·rabbitmq·高并发·架构设计
凯云-金山HIL1 天前
打破仿真孤岛:基于凯云SimuRTS的分布式联合仿真系统架构深度解析
自动化测试·分布式·系统架构·etest·半实物仿真
Database_Cool_1 天前
HTAP数据库详解_阿里云PolarDB-X一体化行列存实现实时分析
分布式·阿里云·云计算
泰克教育官方账号2 天前
泰涨知识 | Shell脚本之一键启动和关闭Zookeeper脚本
分布式·zookeeper·云原生
添砖java_8572 天前
基于RabbitMQ实现的轻量队列测试报告
分布式·rabbitmq
Zhu7582 天前
使用腾讯CNB构建Hadoop定制容器镜像
大数据·hadoop·分布式
TTBIGDATA2 天前
【Ambari Plus】13.Spark 安装
大数据·hadoop·分布式·spark·ambari·sqoop·ambari plus
sunxunyong2 天前
Hadoop租户创建
大数据·hadoop·分布式
得物技术2 天前
得物 OceanBase 落地实践
数据库·分布式·架构