阅读 214

RabbitMQ系列(四) RabbitMQ的虚拟主机

介绍

RabbitMQ是一个多组件系统:Connection、Exchange、Queue、Binding、User Permision、Policies和其他属于虚拟主机(实体的逻辑分组)的组件。
RabbitMQ的虚拟主机的设计思想与Apache的虚拟主机或Nginx的Server相似,不同的是,Apache中的虚拟主机是定义在配置文件中,而RabbitMQ的虚拟主机通过rabbitmqctl工具或者HTTP API进行创建和删除。

逻辑与物理分离

虚拟主机提供逻辑分组和资源分离。物理资源的分离应该将其视为虚拟主机的具体实现。
例如,RabbitMQ中的资源权限限定在每个虚拟主机的范围内。一个用户没有全局权限,只有一个或多个虚拟主机的权限。用户标签可以被认为是全局权限,但它们是规则的例外。因此,在讨论用户权限时,阐明它们适用于什么虚拟主机是非常重要的。
即用户拥有的资源权限是限定在虚拟主机范围内。

虚拟主机与客户连接

虚拟主机有其名称。当一个AMQP0-9-1客户端在连接到RabbitMQ时,需要指定要连接的虚拟主机名称。如果认证成功并且提供的用户名被授予指定虚拟主机的权限,连接将成功建立。
连接到指定虚拟主机后,只能操作该虚拟主机中的Exchange、Queue、Binding等等。当一个应用程序在同时连接两个虚拟主机,才可能出现在不同虚拟主机中的Queue和Exchange之间交互。例如,一个应用程序可以从一个虚拟主机中消费消息并发布到另一个虚拟主机中,这种场景可以涉及到同一集群或不同集群中的虚拟主机。RabbitMQ Shovel插件就是这样一个应用程序。
即客户端连接RabbitMQ时需指定虚拟主机,并只能操作所指定的虚拟主机的资源(Exchange、Queue、Binding等等)。

操作

创建虚拟主机

虚拟主机可以通过CLI工具或者HTTP API服务接口进行创建。 新创建的虚拟主机将有一些默认的Exchange,但没有其他实体和用户权限。为了让用户能够连接并使用虚拟主机,必须分配权限给使用该虚拟主机的用户。 例如,使用rabbitmqctl工具进行设置权限。
即新创建的虚拟主机有一些默认的Exchange,但没有其他实体和用户权限,须对操作用户进行授权。

使用CLI工具

虚拟主机可以通过rabbitmqctl的add_vhost命令进行创建,该命令接收一个必填参数——虚拟主机名称。例如:

> rabbitmqctl add_vhost qa1
复制代码

使用HTTP API

虚拟主机也可以通过HTTP API端点(PUT /api/vhosts/{name})进行创建。其中,{name}是虚拟主机的名称。例如:

> curl -u userename:pa$sw0rD -X PUT http://rabbitmq.local:15672/api/vhosts/vh1
复制代码

批量创建并预设值

创建虚拟主机涉及到阻塞整个集群范围的事务。每个节点都需要执行许多耗时步骤。实际上,创建虚拟主机可能需要几秒钟的时间。 当在一个循环中创建许多虚拟主机时,CLI工具和HTTP API客户端会在创建完虚拟主机时超时。如果是这种情况,应该在操作之间增加并延迟超时时间。
定义的导出和导入是在部署时预先配置虚拟主机的推荐方法。

删除虚拟主机

虚拟主机可以通过CLI工具或者HTTP API服务接口进行删除。 删除虚拟主机将永久删除其中的所有实体(Exchange、Queue、Binding、Policies和用户权限等)。

使用CLI工具

虚拟主机可以通过rabbitmqctl的delete_vhost 命令进行创建,该命令接收一个必填参数——虚拟主机名称。例如:

> rabbitmqctl delete_vhost qa1
复制代码

使用HTTP API

虚拟主机也可以通过HTTP API端点(DELETE /api/vhosts/{name})进行创建。其中,{name}是虚拟主机的名称。例如:

> curl -u userename:pa$sw0rD -X DELETE http://rabbitmq.local:15672/api/vhosts/vh1
复制代码

限制

在某些情况下,可限制虚拟主机中允许的最大队列数或并发客户机连接数。从RabbitMQ 3.7.0开始,这可以通过每个虚拟主机的限制来实现。 这些限制可以通过rabbitmqctl工具或者HTTP API进行配置。

使用rabbitmqctl工具配置限制

rabbitmqctl的set_vhost_limits命令用于定义虚拟主机限制。它需要一个虚拟主机参数和JSON格式的限制定义。

配置最大连接数限制

限制虚拟主机中的并发客户端连接的总数量,使用如下限制定义:

> rabbitmqctl set_vhost_limits -p vhost_name '{"max-connections": 256}'
复制代码

禁用虚拟主机的客户端连接,设置限制为0:

> rabbitmqctl set_vhost_limits -p vhost_name '{"max-connections": 0}'
复制代码

解除限制,将其设置为负值:

> rabbitmqctl set_vhost_limits -p vhost_name '{"max-connections": -1}'
复制代码

配置Queue最大数量

限制虚拟主机中的最大数量Queue,使用如下限制定义:

> rabbitmqctl set_vhost_limits -p vhost_name '{"max-connections": 0}'
复制代码

解除限制,将其设置为负值:

> rabbitmqctl set_vhost_limits -p vhost_name '{"max-queues": -1}'
复制代码

上一篇:RabbitMQ系列(三)RabbitMQ Server的安装(基于Linux RPM)
下一篇:RabbitMQ系列(五) RabbitMQ的文件和目录位置