首页 > 解决方案 > RabbitMQ/AMQP - 如何从外部安全地连接消费者/发布者?

问题描述

我一直在我们的微服务应用程序中寻找合适的交换/队列/用户结构。我找到了这两个很好的解释:herehere,但是我缺少交换/队列/用户定义的一些东西。

我发现最佳实践是在客户端(图中的 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)$

外部工作人员可以连接和断开连接,并且它的消息将在队列中等待,权限也将保留。
我认为为每种类型的工作人员(内部和外部)创建交换和队列以及一组权限将有助于限制开发和生产过程中的错误,但另一方面,必须在添加新类型之前配置所有内容工人(目前仅对外部工人手动完成),这不是一个好习惯。
现在的问题是: 限制外部用户的更好方法是什么?
您是否也会为每种类型的内部工人添加主题交换,以确保生产安全?
你会以不同的方式构建主题结构、交换/队列/用户名吗?

标签: rabbitmqmicroservicesuser-permissionsrabbitmq-exchange

解决方案


推荐阅读