跳至主要内容
版本: 3.13

铲子插件

概述

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

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

rabbitmq_shovel 插件 允许您配置多个铲子(传输工作者),它们可以完成这项工作并在 RabbitMQ 集群中运行。

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

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

铲子在幕后使用 Erlang AMQP 0-9-1Erlang AMQP 1.0 客户端。

为什么要使用铲子

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

松耦合

铲子可以在具有不同地理或管理域的代理(或集群)之间移动消息,这些域可能具有以下特点:

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

WAN 友好

铲子插件在幕后使用 客户端连接确认和发布者确认 用于确保在连接和节点故障情况下数据安全。

跨协议和产品消息传输

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

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

灵活性

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

没有要求在与源或目标相同的代理(或集群)上运行铲子,尽管这通常是最常见的方法;铲子可以在完全独立的节点或集群上运行。

集群联合 之间的比较见 分布式消息传递 指南。

铲子能做什么?

本质上,铲子是一个极简的消息泵。每个铲子都能够:

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

连接

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

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

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

消费

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

重新发布

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

入门

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

rabbitmq-plugins enable rabbitmq_shovel

管理 UI 用户可能还想启用 rabbitmq_shovel_management 插件以进行 铲子状态监控

定义铲子有两种截然不同的方法:动态铲子 是使用 运行时参数 定义的,而 静态铲子 是在 advanced.config 文件 中定义的。

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

静态铲子动态铲子

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

使用 运行时参数 定义。

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

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

不太有主见,不太适合自动化:任何队列、交换机或绑定都可以在启动时手动声明。

更有主见,更适合自动化:铲子使用的队列、交换机和绑定将自动声明。

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

铲子的身份验证和授权

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

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

集群中的铲子故障处理

通常希望确保铲子能够抵抗源或目标集群中任何节点的故障,或者托管铲子的集群的故障。

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

动态铲子会在托管集群中启用铲子插件的所有节点上自动定义。每个铲子只会在一个随机选择的节点上启动,但在节点故障时将在另一个节点上重新启动。

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

使用 TLS 保护铲子连接

铲子连接可以使用 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}}

铲子的关键状态为

状态描述
启动中

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

运行中

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

已终止

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