跳至主要内容
版本:4.0

Shovel 插件

概述

本指南提供了 RabbitMQ Shovel 的概述,RabbitMQ Shovel 是一个核心 RabbitMQ 插件,用于单向移动消息从源到目的地。另外两份指南分别涵盖了 Shovel 的两种类型:动态 Shovel静态 Shovel。这份指南重点介绍概念、Shovel 的工作原理以及它们的功能。

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

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

源和目的地可以在同一个集群中(通常在不同的虚拟主机中)或不同的集群中。Shovel 支持 AMQP 0.9.1 和 AMQP 1.0 源和目的地。源和目的地不必使用相同的协议,因此可以将消息从 AMQP 1.0 代理移动到 RabbitMQ 或反之亦然。

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

Shovel 在后台使用 Erlang AMQP 0-9-1Erlang AMQP 1.0 客户端。

为什么要使用 Shovel

Shovel 是分布式消息传递工具包中一个简约而灵活的工具,可以适应多种用例。以下是其一些关键功能和设计目标。

松耦合

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

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

适合广域网

Shovel 插件在后台使用 客户端连接。使用 确认和发布者确认 以确保在连接和节点故障时的数据安全。

跨协议和产品消息传输

现代 Shovel 版本支持多种协议:AMQP 0.9.1 和 AMQP 1.0。

这意味着可以例如从 AMQP 1.0 代理源到 RabbitMQ 目的地进行 Shovel,反之亦然。将来可能会支持更多协议。

灵活性

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

不需要在与源或目的地相同的代理(或集群)上运行 Shovel,尽管这是最典型的方法;Shovel 可以在完全独立的节点或集群上运行。

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

Shovel 的作用是什么?

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

Shovel 配置允许调整这些过程中的每一个。

连接

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

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

重新连接后,将重新发出该源或目标的所有配置的拓扑声明操作。

消费

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

重新发布

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

入门

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

rabbitmq-plugins enable rabbitmq_shovel

管理 UI 用户可能还希望启用 rabbitmq_shovel_management 插件以进行 Shovel 状态监控

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

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

静态 Shovel动态 Shovel

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

使用 运行时参数 定义。

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

创建和删除不需要节点重启。可以在任何时间创建和删除。

较少意见,较不友好于自动化:任何队列、交换机或绑定都可以在启动时手动声明。

较多意见,较友好于自动化:Shovel 使用的队列、交换机和绑定将自动声明。

请注意,当使用 AMQP 1.0 时,可能仍然需要在 Shovel 之外创建“节点”,因为该协议不包括拓扑创建。

Shovel 的身份验证和授权

该插件在后台使用 Erlang AMQP 0-9-1Erlang AMQP 1.0 客户端来打开与其源和/或目标的连接。就像任何其他 客户端库连接 一样,Shovel 连接必须 成功进行身份验证 并被 授权访问 其尝试使用的虚拟主机和资源。这对源和目标都适用。

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

集群中的 Shovel 故障处理

通常希望确保 Shovel 能够抵御源或目标集群中任何节点或托管 Shovel 的集群的故障。

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

动态 Shovel 会自动在启用 Shovel 插件的托管集群的所有节点上定义。每个 Shovel 只会在一个任意选择的节点上启动,但如果节点发生故障,它将在另一个节点上重新启动。

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

使用 TLS 保护 Shovel 连接

重要

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

如果未配置客户端 TLS 证书和密钥对,则启用了 TLS 的 Shovel 将无法连接。如果不需要对等验证,可以禁用它,否则必须为启用了 TLS 的 Shovel 配置证书和私钥对。

铲子连接可以使用TLS。由于铲子在底层使用客户端库,因此需要同时配置源代理以侦听 TLS 连接,以及在连接时让铲子使用 TLS。

要配置铲子以使用 TLS,需要执行以下操作:

就像使用“常规”客户端连接一样,服务器的 CA 应该在铲子运行的节点上受信任,反之亦然。对于应用程序连接建议使用的相同TLS 故障排除方法也适用于铲子。

监控铲子

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

使用管理 UI

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

使用 CLI 工具

可以使用rabbitmqctl直接查询铲子插件应用程序来获取铲子的状态。

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

结果将返回一个状态列表,每个正在运行的铲子一个。

列表中的每个元素都是一个具有多个属性的映射

  • 名称
  • 类型
  • 状态
  • 上次状态更改时间戳
属性描述
名称铲子的名称
类型静态铲子为static,动态铲子为dynamic
状态铲子的当前状态
时间戳

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

时间戳将返回以下形式的本地日历时间:{{YYYY, MM, DD}, {HH, MM, SS}}

铲子的关键状态为:

状态描述
启动中

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

运行中

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

已终止

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

© 2024 RabbitMQ. All rights reserved.