铲斗插件
概述
本指南概述了 RabbitMQ Shovel,一个核心 RabbitMQ 插件,它单向地将消息从源移动到目标。另有两个指南分别介绍了两种类型的铲斗,即动态铲斗和静态铲斗。本指南重点解释了铲斗的概念、工作原理及其功能。
有时,需要可靠且持续地将消息从一个集群的源(通常是队列)移动到另一个集群的目标(交换机、主题等)。
rabbitmq_shovel
插件允许你配置多个铲斗(传输工作者),它们执行此操作并作为 RabbitMQ 集群的一部分运行。
源和目标可以位于同一集群(通常在不同的虚拟主机中)或不同的集群中。铲斗支持 AMQP 0.9.1 和 AMQP 1.0 源和目标。源和目标不必使用相同的协议,因此可以将消息从 AMQP 1.0 代理移动到 RabbitMQ,反之亦然。
铲斗的行为类似于编写的客户端应用程序,它连接到其源和目标,消费和重新发布消息,并在两端使用确认来处理故障。
铲斗在幕后使用Erlang AMQP 0-9-1和Erlang AMQP 1.0客户端。
为什么使用铲斗
铲斗是分布式消息工具包中一个简洁灵活的工具,可以满足多种用例。以下是其关键功能和设计目标。
松散耦合
铲斗可以在不同的地理或管理域中的代理(或集群)之间移动消息,这些代理(或集群)
- 可能具有不同的松散相关用途
- 可能运行在不同的 RabbitMQ 版本上
- 可能使用不同的消息产品或协议
- 可能具有不同的用户和虚拟主机
适合广域网
铲斗插件在幕后使用客户端连接。确认和发布者确认用于确保连接和节点故障期间的数据安全。
跨协议和产品消息传输
现代铲斗版本支持多种协议: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-1和Erlang AMQP 1.0客户端连接到其源和/或目标。与任何其他客户端库连接一样,铲斗连接必须成功身份验证并获得访问其尝试使用的虚拟主机和资源的授权。这对于源和目标都适用。
铲斗连接的身份验证和授权失败将由运行铲斗的节点记录。
集群中的铲斗故障处理
通常希望确保铲斗对源或目标集群中的任何节点故障,或托管铲斗的集群的故障具有弹性。
可以向铲斗提供源和目标端点的列表。在这种情况下,铲斗将连接到第一个可访问的端点。
动态铲斗会自动定义在启用铲斗插件的主机集群的所有节点上。每个铲斗将只在一个任意选择的节点上启动,但如果节点出现故障,它将重新启动到另一个节点上。
静态铲斗应在启用铲斗插件的主机集群的所有节点的配置文件中定义。同样,每个铲斗将只在一个节点上启动,并在检测到节点故障时在另一个集群节点上重新启动。
使用 TLS 加密铲斗连接
从 Erlang 26 开始,TLS 客户端对等体验证由 TLS 实现默认启用。
如果未配置客户端 TLS 证书和密钥对,则启用 TLS 的铲斗将无法连接。如果不需要对等体验证,则可以禁用它,否则必须为启用 TLS 的铲斗配置证书和私钥对。
铲斗连接可以使用TLS。由于铲斗使用客户端库,因此有必要配置源代理以侦听 TLS 连接,并且铲斗在连接时使用 TLS。
要配置铲斗使用 TLS,需要
- 使用
amqps
URI 模式代替amqp
- 指定 CA 证书和客户端证书/密钥对以及其他参数(特别是启用或禁用对等体验证、对等体验证深度)通过URI 查询参数
- 配置 Erlang 客户端以使用 TLS
与“普通”客户端连接一样,运行铲斗的节点上应该信任服务器的 CA,反之亦然。建议的应用程序连接的相同TLS 排错方法也适用于铲斗。
监控铲斗
有两种方法可以发现铲斗的状态。
使用管理 UI
您可以通过管理插件的管理员区域用户界面查看铲斗状态。管理插件。这要求节点上启用 rabbitmq_shovel_management
插件才能访问管理 UI。
使用 CLI 工具
您可以通过直接查询铲斗插件应用来获取铲斗状态,使用 rabbitmqctl
。
# use the -n switch to target a remote node
rabbitmqctl shovel_status
结果将返回一个状态列表,每个正在运行的铲斗对应一个状态。
列表中的每个元素都是一个包含多个属性的映射。
- 名称
- 类型
- 状态
- 上次状态更改时间戳
属性 | 描述 |
名称 | 铲斗名称 |
类型 | 对于静态铲斗为 static ,对于动态铲斗为 dynamic |
状态 | 铲斗的当前状态 |
时间戳 | 铲斗最后进入该状态的时间(例如,成功连接、连接丢失或遇到异常) |
时间戳将以 {{YYYY, MM, DD}, {HH, MM, SS}}
格式返回本地日历时间。
铲斗的关键状态有:
状态 | 描述 |
启动中 | 铲斗正在启动或尝试连接到其配置的端点。 |
运行中 | 铲斗已成功连接并正在运行(从源消耗并重新发布到目标)。此状态将报告一些基本端点和协议信息。 |
终止 | 铲斗已停止或遇到异常。将提供原因。 |