跳至主内容
版本:4.2

Shovel 插件

概述

本指南概述了 RabbitMQ Shovel,它是 RabbitMQ 的核心插件,用于将消息单向地从源移动到目标。另外两篇指南分别介绍了 Shovel 的两种形式:动态 Shovel静态 Shovel。本指南侧重于解释 Shovel 的概念、工作原理及其功能。

提示

动态 Shovel 是现代 Shovel 类型。如有疑问,请优先选择动态 Shovel。

有时需要可靠地、持续地将消息从一个集群的源(通常是队列)移动到另一个集群的目标(交换器、主题等)。

rabbitmq_shovel 插件允许你配置多个 Shovel(传输工作器),它们可以执行此操作并作为 RabbitMQ 集群的一部分运行。

源和目标可以位于同一集群内(通常在不同的 vhost 中),也可以位于不同的集群中。Shovel 支持 AMQP 0.9.1 和 AMQP 1.0 的源和目标。源和目标不必使用相同的协议,因此可以将消息从 AMQP 1.0 消息代理移动到 RabbitMQ,反之亦然。

Shovel 的行为类似于编写良好的客户端应用程序,它会连接到源和目标,消费并重新发布消息,并在两端使用确认机制来应对故障。

Shovel 在底层使用 Erlang AMQP 0-9-1Erlang AMQP 1.0 客户端。

RabbitMQ 4.2 引入了一种新的协议类型:local Shovel。Local Shovel 不使用任何现有协议连接到源或目标,而是使用内部 API 直接从本地集群的队列中消费和/或发布消息。它们只能在声明 Shovel 的集群上使用。Local Shovel 与 AMQP 0-9-1 Shovel 共享大多数功能和配置。

为什么要使用 Shovel

Shovel 是分布式消息传递工具包中一个极简但灵活的工具,可以适应多种用例。以下是它的一些主要特性和设计目标。

松耦合

Shovel 可以在不同地理或管理域中的代理(或集群)之间移动消息,这些代理(或集群)

  • 可能有不同的、松散关联的目的
  • 可能运行不同版本的 RabbitMQ
  • 可能使用不同的消息传递产品或协议
  • 可能拥有不同的用户和虚拟主机

WAN 友好

Shovel 插件在底层使用客户端连接。使用确认机制和发布者确认可以确保数据在连接和节点发生故障时的安全性。

跨协议和跨产品消息传输

最新的 Shovel 版本支持多种协议:AMQP 0.9.1 和 AMQP 1.0。

这意味着可以从 AMQP 1.0 代理源 Shovel 到 RabbitMQ 目标,反之亦然。未来可能会支持更多协议。

灵活性

当 Shovel 连接(到源或目标)时,可以将其配置为预先声明所需的特定拓扑。

Shovel 不必运行在与其源或目标相同的代理(或集群)上,尽管这是最常见的方式;Shovel 可以在完全独立的节点或集群上运行。

分布式消息传递指南中,提供了集群联邦之间的比较。

Shovel 做什么?

本质上,Shovel 是一个极简的消息泵。每个 Shovel

Shovel 的配置允许对这些过程中的每一个进行定制。

连接

连接到源或目标代理后,可以执行一系列配置的拓扑声明操作。例如,在 AMQP 0-9-1 端点上,可以声明队列、交换器和绑定。

如果发生故障,Shovel 将尝试重新连接,并且可以为源和目标指定多个代理,以便可以选择另一个代理(随机)进行重新连接。可以指定重新连接延迟,以避免网络拥塞,或完全阻止故障时的重新连接。

重新连接时,将重新执行该源或目标的所有配置的拓扑声明操作。

消费

Shovel 的消费者将在接收消息后、(重新)发布后或从目标服务器确认发布后,自动确认消息。

对于 AMQP 0-9-1 和 Local Shovel,被目标拒绝的消息将被重新排队。对于 AMQP 1.0,被目标拒绝的消息将被丢弃。

重新发布

大多数发布和消息属性由操作员控制。

开始使用

Shovel 插件包含在 RabbitMQ 发行版中。要启用它,请使用 rabbitmq-plugins

rabbitmq-plugins enable rabbitmq_shovel

Management UI 用户可能还希望启用 rabbitmq_shovel_management 插件来进行Shovel 状态监控

定义 Shovel 有两种不同的方式:动态 Shovel 使用运行时参数定义,而 静态 Shoveladvanced.config 文件中定义。

下面将介绍这两种方法的优缺点。大多数用户应该首先考虑动态 Shovel,因为它们易于重新配置和管理。

静态 Shovel动态 Shovel

在代理的高级配置文件中定义。

使用运行时参数定义。

创建和删除需要节点重启。

创建和删除不需要节点重启。可以随时创建和删除。

不那么主观,自动化友好性较低:任何队列、交换器或绑定都可以手动声明启动时。

更主观,自动化友好性更高:Shovel 使用的队列、交换器和绑定将自动声明。

请注意,在使用 AMQP 1.0 时,由于该协议不包含拓扑创建,因此“节点”可能仍需要在 Shovel 外部创建。

Shovel 连接端点

Shovel 使用 URI 连接到源和目标。

对于 AMQP 0-9-1,URI 格式遵循RabbitMQ URI 规范

对于 AMQP 1.0,格式略有不同,特别是指定要连接的虚拟主机的部分(假设目标 AMQP 1.0 代理是 RabbitMQ,因此具有该概念)。

请参阅动态 AMQP 1.0 Shovel 参考以了解更多信息。

Shovel 的认证和授权

该插件在底层使用 Erlang AMQP 0-9-1Erlang AMQP 1.0 客户端来打开到其源和/或目标的连接。与任何其他客户端库连接一样,Shovel 连接必须成功认证获得访问它试图使用的虚拟主机和资源的授权。这对源和目标都适用。

Shovel 连接的认证和授权失败将由运行 Shovel 的节点记录

Local Shovel 也受到相同的认证检查。

集群中的 Shovel 故障处理

通常希望确保 Shovel 对源或目标集群中的任何节点或托管 Shovel 的集群的故障具有弹性。

可以为 Shovel 提供源和目标端点的列表。在这种情况下,Shovel 将连接到第一个可达的端点。

动态 Shovel 在已启用 Shovel 插件的主机集群的所有节点上自动定义。每个 Shovel 只会在一个任意选择的节点上启动,但在节点发生故障时会在另一个节点上重新启动。

静态 Shovel 应在已启用 Shovel 插件的主机集群的所有节点上在配置文件中定义。同样,每个 Shovel 只会在一个节点上启动,并在检测到节点故障时在另一个集群节点上重新启动。

使用 TLS 保护 Shovel 连接

重要

从 Erlang 26 开始,TLS 实现默认启用TLS 客户端对等方验证

如果未配置客户端 TLS 证书和密钥对,启用 TLS 的 Shovel 将无法连接。对于需要使用对等验证的启用 TLS 的 Shovel,必须配置证书(公钥)和私钥对。

如果不需要对等验证,则可以禁用它。

要将 Shovel 配置为使用 TLS,需要

  • 在源和目标 URI 中,使用 amqps 作为方案而不是 amqp,并使用端口 5671 而不是 5672(假设使用的是默认端口,但端口已显式指定)。
  • 在相同的源和目标 URI 中,通过URI 查询参数指定 CA 证书和客户端证书/密钥对,以及其他参数(特别是启用或禁用对等验证对等验证深度)。
  • 可以选择通过 Erlang 客户端设置配置与 TLS 相关的设置或所有 Shovel 的默认设置(此外,还可以选择联邦链接)。

在以下示例中,源 URI 不使用 TLS(它连接到 localhost,这可能是合理的),而目标 URI 已修改为使用 TLS 和客户端证书(公钥)和私钥对,但禁用对等验证(为简化起见,建议在生产环境中使用)。

# Note: this user's access is limited to localhost.
#
# In the following example, the source URI connects to `localhost` and does not use TLS
# while the destination URI is modified to use TLS with peer verification disabled
# for simplicity
curl -v -u guest:guest -X PUT https://:15672/api/parameters/shovel/%2f/my-shovel \
-H "content-type: application/json" \
-d @- <<EOF
{
"value": {
"src-protocol": "amqp091",
"src-uri": "amqp://",
"src-queue": "source-queue",
"dest-protocol": "amqp091",
"dest-uri": "amqps://target.hostname:5671?cacertfile=/path/to/ca_bundle.pem&certfile=/path/to/client_certificate.pem&keyfile=/path/to/client_key.pem&verify=verify_none",
"dest-queue": "destination-queue"
}
}
EOF

这些示例使用了带有四个额外URI 查询参数的 URI。

  • cacertfile:CA 证书包文件,其中包含一个或多个用于签署客户端证书和私钥对的 CA 证书。
  • certfile:客户端证书(公钥)。
  • keyfile:客户端私钥。
  • verify控制对等验证(在此特定示例中,禁用它)。

与“普通”客户端连接一样,如果启用 TLS 的 Shovel 需要执行对等验证,那么服务器的 CA 必须在运行 Shovel 的节点上受信任,反之亦然。

Local Shovel 不使用任何连接,因此不使用 TLS。

监控 Shovel

有两种方法可以发现 Shovel 的状态。

使用 Management UI

Shovel 的状态可以在Management 插件的用户界面的管理部分报告。这需要启用用于访问 Management UI 的节点的 rabbitmq_shovel_management 插件。

使用 CLI 工具

可以通过直接查询 Shovel 插件应用程序来获取 Shovel 状态,使用rabbitmqctl

# use the -n switch to target a remote node
rabbitmqctl shovel_status

结果将返回一个状态列表,每个运行的 Shovel 一个。

列表中的每个元素都是一个包含多个属性的映射。

  • 名称
  • 类型
  • 状态
  • 最后状态变更时间戳
属性描述
名称Shovel 的名称
类型static 表示静态 Shovel,dynamic 表示动态 Shovel。
状态Shovel 的当前状态。
时间戳

Shovel 上次进入此状态的时间(例如,成功连接、连接丢失、遇到异常)。

时间戳将返回本地日历时间,格式为 {{YYYY, MM, DD}, {HH, MM, SS}}

Shovel 的关键状态是

状态描述
starting(启动中)

Shovel 正在启动或尝试连接到其配置的端点。

running

Shovel 已成功连接并正在运行(从源消费并重新发布到目标)。此状态将报告一些基本端点和协议信息。

terminated(已终止)

Shovel 已停止或遇到异常。将提供原因。

© . This site is unofficial and not affiliated with VMware.