热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

rabbitmq学习之shovel插件使用(24)

转载自: https:yq.aliyun.comarticles42383?spma2c4e.11153940.0.0.666f202bTDO7gA  从之前的两篇文章《 【原创】

转载自: https://yq.aliyun.com/articles/42383?spm=a2c4e.11153940.0.0.666f202bTDO7gA   

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










Static ShovelsDynamic Shovels
基于 broker 的配置文件进行定义基于 broker 的 parameter 参数进行定义
Require a restart of the hosting broker to change.需要重启宿主 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 连接,和普通客户端的连接行为没什么不同;



推荐阅读
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 今天我开始学习Flutter,并在Android Studio 3.5.3中创建了一个新的Flutter项目。然而,在首次尝试运行时遇到了问题,Gradle任务 `assembleDebug` 执行失败,退出状态码为1。经过初步排查,发现可能是由于依赖项配置不当或Gradle版本不兼容导致的。为了解决这个问题,我计划检查项目的 `build.gradle` 文件,确保所有依赖项和插件版本都符合要求,并尝试更新Gradle版本。此外,还将验证环境变量配置是否正确,以确保开发环境的稳定性。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 在最近的WWDC17大会上,苹果公司宣布了多项重要更新,其中一项是macOS High Sierra 10.13 Final的正式发布。这一版本经过优化,显著提升了系统的稳定性和响应速度,为用户在任何Mac设备上提供了更加流畅的使用体验。本文将详细介绍如何在Windows系统中利用VMware虚拟机软件安装并运行macOS High Sierra 10.13 Final,帮助用户在非苹果硬件上体验这一先进操作系统。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 卓盟科技:动态资源加载技术的兼容性优化与升级 | Android 开发者案例分享
    随着游戏内容日益复杂,资源加载过程已不仅仅是简单的进度显示,而是连接玩家与开发者的桥梁。玩家对快速加载的需求越来越高,这意味着开发者需要不断优化和提升动态资源加载技术的兼容性和性能。卓盟科技通过一系列的技术创新,不仅提高了加载速度,还确保了不同设备和系统的兼容性,为用户提供更加流畅的游戏体验。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 该问题可能由守护进程配置不当引起,例如未识别的JVM选项或内存分配不足。建议检查并调整JVM参数,确保为对象堆预留足够的内存空间(至少1572864KB)。此外,还可以优化应用程序的内存使用,减少不必要的内存消耗。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • 深入解析C#中app.config文件的配置与修改方法
    在C#开发过程中,经常需要对系统的配置文件进行读写操作,如系统初始化参数的修改或运行时参数的更新。本文将详细介绍如何在C#中正确配置和修改app.config文件,包括其结构、常见用法以及最佳实践。此外,还将探讨exe.config文件的生成机制及其在不同环境下的应用,帮助开发者更好地管理和维护应用程序的配置信息。 ... [详细]
  • 在 CentOS 6.5 系统上部署 VNC 服务器的详细步骤与配置指南
    在 CentOS 6.5 系统上部署 VNC 服务器时,首先需要确认 VNC 服务是否已安装。通常情况下,VNC 服务默认未安装。可以通过运行特定的查询命令来检查其安装状态。如果查询结果为空,则表明 VNC 服务尚未安装,需进行手动安装。此外,建议在安装前确保系统的软件包管理器已更新至最新版本,以避免兼容性问题。 ... [详细]
author-avatar
手机用户2502895475
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有