rabbitmq - RabbitMQ/AMQP - 如何从外部安全地连接消费者/发布者?
问题描述
我一直在我们的微服务应用程序中寻找合适的交换/队列/用户结构。我找到了这两个很好的解释:here和here,但是我缺少交换/队列/用户定义的一些东西。
我发现最佳实践是在客户端(图中的 usr_worker 或 usr_external )中定义交换和队列及其绑定以实现可伸缩性(我正确吗?),但这意味着客户端必须有权定义所有这些一个虚拟主机。在远程计算机上部署客户端时,我想给它尽可能少的权限。
我想出了以下结构:
我有一个默认的扇出交换,它将所有消息发送到 q_all_log 队列和一个默认的主题交换。
主题交换通过键将消息分发到队列(q_worker 和 q_user_external)。
工作人员使用所有到达其预定义队列的消息。内部工作人员正在发布到默认的扇出交换。
外部工作人员使用用户名/密码连接到预定义的交换和具有预定义权限集的预定义队列 -
config: ^(q_user_external1.*|ex_user_external1.*)$, write: ^(ex_user_external1.*)$, , read: ^(q_user_external1.*)$
,
并且由于交换是主题交换,我可以限制用户仅发布到特定主题。
Virtual host Exchange
my-vhost ex_user_external1
Write regexp:
^(transaction.v1.owner.place1.device.event.created|transaction.v1.owner.place1.device.event.confirmed)$
Read regexp:
^(transaction.v1.owner.place1.device.cmd.create)$
外部工作人员可以连接和断开连接,并且它的消息将在队列中等待,权限也将保留。
我认为为每种类型的工作人员(内部和外部)创建交换和队列以及一组权限将有助于限制开发和生产过程中的错误,但另一方面,必须在添加新类型之前配置所有内容工人(目前仅对外部工人手动完成),这不是一个好习惯。
现在的问题是:
限制外部用户的更好方法是什么?
您是否也会为每种类型的内部工人添加主题交换,以确保生产安全?
你会以不同的方式构建主题结构、交换/队列/用户名吗?
解决方案
推荐阅读
- git - 如何在 Visual Studio Code 中推送 Git 标记?
- javascript - 如何在 NOSQL 中建立关系,例如 firestore
- python - 用户密码不变
- php - 使用 Laravel Mix 编译时出错 - Vue
- c - 声明并分配给函数调用的 C 变量
- python - 如何在 python 中使用类型创建类时设置元类?
- c++ - 冒泡排序算法中的外循环(i循环)有什么用?
- java - 在一个 gradle(或 maven)多个项目中集成 spring 项目和 EJB 项目
- javascript - 为什么 currentTarget 值为空
- ios - 从 Bar Button 项导航到导航控制器