跳至主要内容
版本:4.0

虚拟主机

简介

RabbitMQ 是一个多租户系统:连接、交换机、队列、绑定、用户权限、策略和其他一些内容都属于**虚拟主机**,即实体的逻辑组。如果您熟悉Apache 中的虚拟主机Nginx 中的服务器块,则其理念类似。

但是,存在一个重要的区别:Apache 中的虚拟主机是在配置文件中定义的;RabbitMQ 并非如此:虚拟主机是使用rabbitmqctl或 HTTP API创建删除的。

逻辑和物理分离

虚拟主机提供资源的逻辑分组和分离。尽管可以为各个虚拟主机限制某些资源,但物理资源的分离并非虚拟主机的目标。

例如,RabbitMQ 中的资源权限是在每个虚拟主机范围内限定的。用户没有全局权限,而只有在一个或多个虚拟主机中的权限。用户标签可以被视为全局权限,但它们是规则的例外。

因此,在谈论用户权限时,明确它们适用于哪些虚拟主机非常重要。

虚拟主机和客户端连接

虚拟主机有一个名称。当 AMQP 0-9-1 客户端连接到 RabbitMQ 时,它会指定要连接到的虚拟主机名称。如果身份验证成功并且提供的用户名被授予对虚拟主机的权限,则建立连接。

连接到虚拟主机的操作只能在该虚拟主机中的交换机、队列、绑定等上进行。例如,不同虚拟主机中的队列和交换机的“互连”只有在应用程序同时连接到两个虚拟主机时才有可能。例如,应用程序可以从一个虚拟主机消费,然后重新发布到另一个虚拟主机。此场景可能涉及不同集群或同一集群(或单个节点)中的虚拟主机。RabbitMQ Shovel 插件就是此类应用程序的一个示例。

创建虚拟主机

可以使用 CLI 工具或HTTP API端点创建虚拟主机。

新创建的虚拟主机将有一组默认的交换机,但没有其他实体,也没有用户权限。为了让用户能够连接并使用虚拟主机,必须授予将使用该虚拟主机的每个用户对它的权限,例如,使用rabbitmqctl set_permissions

使用 CLI 工具

可以使用rabbitmqctladd_vhost命令创建虚拟主机,该命令接受虚拟主机名称作为唯一必填参数。

以下示例创建了一个名为qa1的虚拟主机

rabbitmqctl add_vhost qa1

使用 HTTP API

可以使用PUT /api/vhosts/{name}HTTP API端点创建虚拟主机,其中{name}是虚拟主机的名称

以下示例使用curl通过联系rabbitmq.local:15672处的节点来创建虚拟主机vh1

curl -u userename:pa$sw0rD -X PUT http://rabbitmq.local:15672/api/vhosts/vh1

批量创建和预配置

虚拟主机创建涉及一个阻塞的集群范围事务。每个节点都必须执行许多设置步骤,这些步骤成本适中。实际上,创建虚拟主机可能需要几秒钟。

当在循环中创建许多虚拟主机时,CLI 和 HTTP API 客户端可能会超过虚拟主机创建的实际速率并遇到超时。如果出现这种情况,应增加操作超时并操作之间引入延迟。

定义导出和导入是在部署时预配置许多虚拟主机的推荐方法。

虚拟主机元数据

虚拟主机可以与其关联的元数据。

  • 描述
  • 一组标签
  • 为虚拟主机配置的默认队列类型

所有这些设置都是可选的。它们可以在虚拟主机创建时提供,也可以稍后更新。

使用 CLI 工具

rabbitmqctl add_vhost命令接受虚拟主机名称以及许多可选标志。

以下示例创建了一个名为qa1的虚拟主机,其默认队列类型为仲裁队列,并带有一个描述和两个标签

rabbitmqctl add_vhost qa1 --description "QA env 1" --default-queue-type quorum

rabbitmqctl update_vhost_metadata可用于更新上面演示的所有或某些元数据值

rabbitmqctl update_vhost_metadata qa1 --description "QA environment for issue 1662" --default-queue-type quorum --tags qa,project-a,qa-1662

要检查虚拟主机元数据,请使用rabbitmqctl list_vhosts并提供其他列

rabbitmqctl -q --formatter=pretty_table list_vhosts name description tags default_queue_type

使用 HTTP API

PUT /api/vhosts/{name}HTTP API端点接受许多可选键。

以下示例使用curl通过联系rabbitmq.local:15672处的节点来创建虚拟主机qa1仲裁队列将用于默认队列类型,并带有一个描述和两个标签

curl -u userename:pa$sw0rD -X PUT http://rabbitmq.local:15672/api/vhosts/qa1 \
-H "content-type: application/json" \
--data-raw '{"description": "QA environment 1", "tags": "qa,project-a", "default_queue_type": "quorum"}'

可用于更新上面演示的所有或某些元数据值

curl -u userename:pa$sw0rD -X PUT http://rabbitmq.local:15672/api/vhosts/qa1 \
-H "content-type: application/json" \
--data-raw '{"description": "QA environment for issue 1662", "tags": "qa,project-a,qa-1662", "default_queue_type": "quorum"}'

GET /api/vhosts/{name}端点返回虚拟主机元数据

curl -u userename:pa$sw0rD -X GET http://rabbitmq.local:15672/api/vhosts/qa1

默认队列类型 (DQT)

当客户端声明队列时,如果未使用x-queue-type标头显式指定其类型,则会使用可配置的默认类型。可以通过在虚拟主机元数据中指定它来覆盖默认值(请参见上文)

rabbitmqctl add_vhost qa1 --description "QA environment 1" --default-queue-type quorum --tags qa,project-a

支持的队列类型为

  • "quorum"
  • "stream"
  • "classic"

默认值仅对新的队列声明有效;更新默认值不会影响任何现有队列或流的队列类型,因为队列类型是不可变的,并且在声明后无法更改。

从 RabbitMQ 3.13.4开始,对于未显式设置队列类型的队列,有效的虚拟主机默认值将在定义导出时注入到队列属性中。

节点范围的默认队列类型 (节点范围的 DQT)

从 RabbitMQ 3.13.4开始,可以使用rabbitmq.conf设置节点范围的默认值,而不是为集群中的每个虚拟主机配置相同的默认队列类型。

# supported values are: quorum, stream, classic, or a custom queue type module name
default_queue_type = quorum

当同时设置虚拟主机 DQT 和节点范围的 DQT 时,虚拟主机 DQT 将优先。

迁移到仲裁队列:一种放宽队列属性等效性检查的方法

队列属性等效性检查可以使用布尔设置quorum_queue.property_equivalence.relaxed_checks_on_redeclaration来放宽,这使得可以放宽仲裁队列的队列属性等效性检查。

具体来说,当重新声明仲裁队列并且客户端提供的类型设置为“classic”时,此设置将有助于避免通道异常,从而使您可以逐步迁移到仲裁队列,而无需在短时间内升级所有应用程序。

# this setting is meant to be used during transitionary periods when
# RabbitMQ default queue type is changed but not all applications have been
# updated yet
quorum_queue.property_equivalence.relaxed_checks_on_redeclaration = true

删除虚拟主机

可以使用 CLI 工具或HTTP API端点删除虚拟主机。

删除虚拟主机将永久删除其中的所有实体(队列、交换机、绑定、策略、权限等)。

使用 CLI 工具

可以使用rabbitmqctldelete_vhost命令删除虚拟主机,该命令接受虚拟主机名称作为唯一必填参数。

以下示例删除了一个名为qa1的虚拟主机

rabbitmqctl delete_vhost qa1

使用 HTTP API

可以使用DELETE /api/vhosts/{name}HTTP API端点删除虚拟主机,其中{name}是虚拟主机的名称

以下示例使用curl通过联系rabbitmq.local:15672处的节点来删除虚拟主机vh1

curl -u userename:pa$sw0rD -X DELETE http://rabbitmq.local:15672/api/vhosts/vh1

限制

在某些情况下,需要限制虚拟主机中允许的最大队列数或并发客户端连接数。从 RabbitMQ 3.7.0 开始,可以通过**每个虚拟主机的限制**实现此目的。

可以使用rabbitmqctlHTTP API配置这些限制。

使用 rabbitmqctl 配置限制

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

配置最大连接数限制

要限制虚拟主机 vhost_name 中并发客户端连接的总数,请使用以下限制定义

rabbitmqctl set_vhost_limits -p vhost_name '{"max-connections": 256}'

要阻止客户端连接到虚拟主机,请将限制设置为零

rabbitmqctl set_vhost_limits -p vhost_name '{"max-connections": 0}'

要取消限制,请将其设置为负值

rabbitmqctl set_vhost_limits -p vhost_name '{"max-connections": -1}'

配置最大队列数

要限制虚拟主机 vhost_name 中队列的总数,请使用以下限制定义

rabbitmqctl set_vhost_limits -p vhost_name '{"max-queues": 1024}'

要取消限制,请将其设置为负值

rabbitmqctl set_vhost_limits -p vhost_name '{"max-queues": -1}'

虚拟主机和 STOMP

与 AMQP 0-9-1 类似,STOMP 包括虚拟主机的概念。有关详细信息,请参阅STOMP 指南

虚拟主机和 MQTT

与 AMQP 0-9-1 和 STOMP 不同,MQTT 没有虚拟主机的概念。默认情况下,MQTT 连接使用单个 RabbitMQ 主机。有一些 MQTT 特定的约定和功能,使客户端能够连接到特定的虚拟主机,而无需修改任何客户端库。有关详细信息,请参阅MQTT 指南

© 2024 RabbitMQ. All rights reserved.