文档章节

【原创】RabbitMQ 的 shovel 插件使用

摩云飞
 摩云飞
发布于 2016/04/14 14:48
字数 1542
阅读 1256
收藏 9


      从之前的两篇文章《 【原创】RabbitMQ 之 Shovel(翻译) 》和《 【原创】RabbitMQ 之 Dynamic Shovel(翻译) 》中,我们已经知道 shovel 插件的使用存在 static 和 dynamic 两种形式,其主要差异如下

Static Shovels Dynamic Shovels
基于 broker 的配置文件进行定义 基于 broker 的 parameter 参数进行定义
需要重启宿主 broker 以便配置生效 可以在任意时间进行创建和删除,直接生效
更加通用:任何 queue 、exchange 或 binding 关系均可在启动时手动声明 更具有目标性:被 shovel 所使用的 queue 、exchange 和 binding 关系能够自动被声明(创建)

在了解了 shovel 的基本功能之后,下一个需要考虑的问题就是 shovel 的使用场景。相关的几个问题总结如下:

1.为什么需要使用 shovel 插件?
答:当业务需要可靠且连续地将消息从一个 broker 的 queue 里搬运(转发)到另一个 broker 的 exchange 时(最终达到某个 queue 里 )使用;作为 source 的 queue 和作为 destination 的 exchange 可以位于同一个 broker 上(通常要求处于不同的 vhost 下),也可以位于不同的 broker 上。

2.使用 shovel 插件的好处?
答:shovel 基于 RabbitMQ 的 Erlang 客户端实现,且作为 built-in 插件被使用,故可以随 broker 的启动而自动启动;shovel 具有松耦合特性:通过该插件可以在分属不同管理域下的 broker 或 cluster 之间进行消息的搬运;shovel 具有 WAN 友好特性:基于 AMQP 0-9-1 协议实现,并设计成能够保证在不稳定网络场景下不丢失消息;shovel 具有高度可定制性:允许在 shovel 建立连接后,立即执行指定的 AMQP 方法进行定制化操作(例如声明 queue 的动作);

3.shovel 与 cluster 的结合问题
答:如果每个 shovel 均指定了属于源集群或目的集群中的多个 source URI 或 destination URI ,那么当 shovel 遇到节点失效时,就可以进行失效转移操作;对于 dynamic shovel 来说,其定义信息会出现在使能了 shovel 插件的、目标集群中的所有节点上(即所有节点都能获取到 shovel 的定义信息),而每一个 shovel 仅会在集群中的某一个节点上启动(任意一个),并在该节点失效后,转移到另外的节点上去;对于 static shovel 来说,需要在使能了 shovel 插件的、目标集群中的所有节点的配置文件中添加相应的定义信息,同样的,每一个 shovel 仅会在集群中的某一个节点上启动,并在该节点失效后转移到另外的节点上去。

下面给出 shovel 使用场景示例图(取自 《RabbitMQ in Action》)

(大概意思描述,下同)在两个地理位置相距较远的地方布置了两个 RabbitMQ 节点,其中 Goleta 节点用于负责大部分订单的处理,而 Carpinteria 节点用于解决 Goleta 节点达到一个负荷后的、额外订单的处理。该场景属于基于 WAN 的互联,所以无法使用 RabbitMQ 的集群功能;


在未使用 shovel 功能前,只能通过同时将订单发往两地的方式进行处理,在这种场景下,最大延迟取决于较远的一端;并且可能会对业务提出变更要求;

在使用了 shovel 插件后,模型变成了近端同步确认,远端异步确认的方式,大大提高了订单确认速度,并且还能保证可靠性;

最终的内部结构图如上图所示。
一句话总结:shovel 适用于需要对资源请求(订单)快速作出响应的场景,能够有效利用跨 WAN 的其他 broker 或 cluster 一起进行请求的处理(订单处理)。

针对 static 和 dynamic 两种配置的 shovel 的实验

【static shovel】
首先按照《RabbitMQ in Action》中的示例进行配置(调整了监听端口,以及 user 和 password

此时在 Web UI 上会看到如下错误信息

或者

这两个状态在不停的切换,表明 RabbitMQ 内部在不断重新尝试建立 shovel 连接;

通过日志可以看出,问题出现在 shovel 插件建立 AMQP 连接过程的握手节点,而错误原因为“ access to vhost '',  refused by user 'dev' ”。说明 vhost 的指定有错误。
通过抓包内容同样可以确认这一点。

重新调整配置文件如下


上图中的红框位置为增加的内容,其中 %2F 代表的就是 vhost "/" ,此处需要进行转义使用。
变更配置后,重启相应的 broker ,此时可以看到

source broker

destination broker

可以看到 shovel 已经正常运行了,查看此时的网络连接情况如下(注:source broker 在 81.111 上,destination broker 在 80.111 上)

[root@Betty rabbitmq]# netstat -natp|grep 6672
tcp        0      0 172.16.81.111:36489         172.16.81.111:6672          ESTABLISHED 12739/beam.smp  -- shovel 作为 consumer 从 source broker 上进行消费的 TCP 连接
tcp        0      0 172.16.81.111:35203         172.16.80.111:6672          ESTABLISHED 12739/beam.smp  -- shovel 作为 producer 向 destination broker 发送消息的 TCP 连接
tcp        0      0 :::6672                     :::*                        LISTEN      12739/beam.smp
tcp        0      0 ::ffff:172.16.81.111:6672   ::ffff:172.16.81.111:36489  ESTABLISHED 12739/beam.smp      
[root@Betty rabbitmq]#

到此,静态 shovel 的基本使用已经摸的比较清楚了~~

【dynamic shovel】
有了 static shovel 作为基础,可以快速掌握 dynamic shovel 的使用情况。
参考官方文档 【原创】RabbitMQ 之 Dynamic Shovel(翻译) 中提到的简单示例内容进行配置,会遇到如下错误



简单调整后的正确输出如下


最后的总结:

  • 在使用 shovel 插件时,只需要在 source 节点进行配置,destination 节点不需要配置;同理,只需要在 source 节点上使能 shovel 插件,destination 节点无需使能该插件;
  • 在 shovel 正常工作时,对于 source 节点来说,增加了一条用于 consumer 的 TCP 连接;对于 destination 节点来说,增加了一条用于 producer 的 TCP 连接,和普通客户端的连接行为没什么不同;

 

 

 

© 著作权归作者所有

共有 人打赏支持
摩云飞
粉丝 367
博文 534
码字总数 952694
作品 0
徐汇
程序员
私信 提问
加载中

评论(5)

风雨诗轩
风雨诗轩
找到答案了,如果不对虚拟主机进行转义的话,那么指定默认虚拟主机(/)会引发一个API错误,因为服务器会将“/”视为一个路径分隔符,转义之后,请求路径/api/queues///test_queue就会变成/api/queues/%2F/test_queue,API服务器就能理解了
风雨诗轩
风雨诗轩
1.博主你好,本来就有一个“/”,如果再加一个转义“/%2f",那不变成两个”//“了吗?为什么需要两个//
2.还有一个,就是你说destination不需要配置shovel,那么你想先在destination上测试消费者的时候,会报找不到队列的错误,因为队列定义在source节点的destination元祖属性里,这不矛盾吗?
摩云飞
摩云飞

引用来自“zhjh”的评论

验证过么?我测试了N次,好像请求实际上就是没转发过去。
验证过的呀,消息正常转发~
z
zhjh
状态这些都是正常,日志中也没有错误。
z
zhjh
验证过么?我测试了N次,好像请求实际上就是没转发过去。
【原创】RabbitMQ 之 Plugins(翻译)

为了方便工作中使用,对 RabbitMQ 的【插件】相关文档进行了翻译,鉴于自己水平有限,翻译中难免有纰漏产生,如果疑问,欢迎指出探讨。此文以中英对照方式呈现。 官方原文:http://www.rabb...

摩云飞
2012/12/12
0
0
RabbitMQ通过shovel插件迁移数据

前言 生产环境中会遇到RabbitMQ数据迁移的场景,例如:切换云服务厂商、不同Region之间数据迁移、新搭建RabbitMQ实例,数据需要同步至新的RabbitMQ实例。 前提条件: 源RabbitMQ实例打开了s...

中间件小哥
11/14
0
0
(十一)RabbitMQ消息队列-如何实现高可用

在前面讲到了RabbitMQ高可用集群的搭建,但是我们知道只是集群的高可用并不能保证应用在使用消息队列时完全没有问题,例如如果应用连接的RabbitMQ集群突然宕机了,虽然这个集群时可以使用的,...

Super_RD
2017/05/02
0
0
RabbitMQ管理插件的安装

先安装rabbitmq-server这里就不写了,之前有篇文章里有相关步骤:RabbitMQ的安装与配置 如果/etc/rabbitmq不存在会报如下错误: Error: {cannotwriteenabledpluginsfile,”/etc/rabbitmq/ena...

openthings
2015/05/21
0
0
【原创】rabbitmq-plugins用户手册(翻译)

为了方便工作中使用,周末抽空对 rabbitmq-plugins 用户手册进行了翻译,鉴于自己水平有限,翻译中难免有纰漏产生,如果疑问,欢迎指出探讨。 官方原文:http://www.rabbitmq.com/man/rabbi...

摩云飞
2012/11/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

apache顶级项目(二) - B~C

apache顶级项目(二) - B~C https://www.apache.org/ Bahir Apache Bahir provides extensions to multiple distributed analytic platforms, extending their reach with a diversity of s......

晨猫
今天
1
0
day152-2018-11-19-英语流利阅读

“超级食物”竟然是营销噱头? Daniel 2018-11-19 1.今日导读 近几年来,超级食物 superfoods 开始逐渐走红。不难发现,越来越多的轻食餐厅也在不断推出以超级食物为主打食材的健康料理,像是...

飞鱼说编程
今天
7
0
SpringBoot源码:启动过程分析(二)

接着上篇继续分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 一样的,我们先把时序图贴上来,方便理解: 二.源码分析 回顾一下,前面我们分析到了下...

Jacktanger
昨天
3
0
Apache防盗链配置,Directory访问控制,FilesMatch进行访问控制

防盗链配置 通过限制referer来实现防盗链的功能 配置前,使用curl -e 指定referer [root@test-a test-webroot]# curl -e "http://www.test.com/1.html" -x127.0.0.1:80 "www.test.com/1.jpg......

野雪球
昨天
5
0
RxJava threading

因为Rx针对异步系统设计,并且Rx也自然支持多线程,所以新的Rx开发人员有时会假设Rx默认是多线程的。在其他任何事情之前,重要的是澄清Rx默认是单线程的。 除非另有说明,否则每次调用onNex...

woshixin
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部