RabbitMQ 教程

Shovel 插件简介

Shovel 插件和 Federation 插件具备数据转发功能类似的能力,Shovel 能够可靠、持续地从一个 Broker 中的队列(源端)拉取数据并转发到另一个 Broker 中的交换器(目的端)。

注意:作为源端的队列(Queue)和作为目的端的交换器(Exchange)可以同时位于同一个 Broker 上,也可以位于不同的 Broker 上。

Shovel 可以翻译为“铲子,铁锹;(推土机、挖土机等的)铲,铲形部分;一铲(的量)”,是一种比较形象的比喻。这个“铲子”可以将消息从同一个 Broker 的一个队列“挖到”另一个交换器。或者从一个 Broker “挖到” 另一个 Broker。

Shovel 的行为就像优秀的客户端应用程序能够负责连接源和目的地、负责消息的读写及负责连接失败问题的处理。

Shovel 优点

  • 松耦合:Shovel 可以移动位于不同管理域中的 Broker 上的消息,这些 Broker 可以包括不同的用户和 vhost(虚拟主机),也可以使用不同的 RabbitMQ 和 Erlang 版本。

  • 支持广域网:Shovel 插件同样基于 AMQP 协议在 Broker 之间进行通行,被设计成可以容忍时断时续的连通情形,并且能够保证消息的可靠性。

  • 高度定制:当 Shovel 成功连接后,可以对其进行配置以执行相关的 AMQP 命令。

Shovel 原理

下图显示了 Shovel 的机构示意图:

上图中,共有两个 Broker,分别为 broker1(IP地址:192.168.116.51)和 broker2(IP地址:192.168.116.52)。broker1 中有交换器 exchange1 和队列 queue1,且通过路由键 “rk1” 进行绑定;broker2 中有交换器 exchange2 和队列 queue2,且通过路由键 “rk2” 进行绑定。

在 broker1 的 queue1 队列和 broker2 的 exchange2 交换器之间配置了一个 Shovel 连接,当一条消息从客户端发送至 exchange1 交换器的时候。该消息将通过 Shovel 连接流转到 queue2 队列。如果在配置 Shovel 连接时设置了 add_forward_headers 参数为 true,则在消费到队列 queue2 中消息的时候会有特殊的 headers 属性标记。

通常情况下,使用 Shovel 时配置队列作为源端,交换器作为目的端。同样也可以将队列配置为目的端,如下图:

上图中,虽然看起来队列 queue1 是通过 Shove 连接直接将消息转发至 queue2 的,其实中间也是经由 broker2 的默认交换器转发。

当然,Shovel 配置交换器为源端也是可行的,如下图:

上图中,看起来交换器 exchange1 是通过 Shovel 连接直接将消息转发至 exchange2 上的,实际上在 brokerl 中会新建一个队列(名称由 RabbitMQ 自定义)并绑定到 exchange1,消息从交换器 exchange1 路由先存储在这个队列中,然后 Shovel 再从这个队列中拉取消息进而转发至交换器 exchange2。

Shovel 可以在 成功连接源端或者目的端 Broker 之后再次创建交换器和队列,并不一定需要在 Shovel 连接建立之前就创建好交换器和队列。

Shovel 可以为源端或者目的端配置多 Broker 的地址,这样可以使得源端或者目的端的 Broker 失效后能够尝试重连到其他 Broker 之上(随机挑选)。注意:可通过设置 reconnect delay 参数以避免由于重连行为导致的网络泛洪,或者可以在重连失败后直接停止连接。针对源端和目的端的所有配置声明会在重连成功之后被重新发迭。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号