首页 > 其他分享 >RabbitMQ之Shovel插件

RabbitMQ之Shovel插件

时间:2024-12-24 17:09:39浏览次数:4  
标签:交换器 插件 Shovel 队列 Broker RabbitMQ 消息

部署背景:

  • 混合部署在一个集群内,发生资源抢夺就会造成某一个rabbitmq节点high_watermark告警。
  • a、multi-env    
  • b、[_^strong:617eaaa5!]Stateless/Stateful 
  • 资源使用不均衡
  • 混合云迁移

RabbitMQ是一个开源的消息代理软件,它可以用于构建分布式系统中的消息传递架构。RabbitMQ提供了许多插件来扩展其功能,其中之一是Shovel插件。本文将详细介绍RabbitMQ的Shovel插件是什么,以及如何使用它来实现消息传递。


什么是Shovel插件

Shovel 能够可靠、持续地从一个 Broker 中的队列 (作为源端,即 source)拉取数据并转发至另一个 Broker 中的交换器(作为目的端,即 destination)。作为源端的队列和作为目的端的交换器可以同时位于同一个 Broker 上,也可以位于不同的 Broker 上。Shovel 可以翻译为“铲子”,是一种比较形象的比喻,这个“铲子”可以将消息从一 方“挖到”另一方。Shovel 的行为就像优秀的客户端应用程序能够负责连接源和目的地、负责 消息的读写及负责连接失败问题的处理。

Shovel 的主要优势在于:

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

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

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


Shovel 的原理

如下图:展示的是Shovel的结构示意图。

 

这里一共有两个Broker:broker1 和 broker2。

  • broker1 中有交换器 exchange1 和队列 queue1,且这两者通 过路由键“rk1”进行绑定;

  • broker2 中有交换器 exchange2 和队列 queue2,且这两者通过路由键 “rk2”进行绑定。

在队列 queue1 和交换器 exchange2 之间配置一个 Shovel link,当一条内容为 “shovel test payload”的消息从客户端发送至交换器 exchange1 的时候,这条消息会经过下图中的数据流转最后存储在队列 queue2 中。

如果在配置 Shovel link 时设置了 add_forward_headers 参数为 true,则在消费到队列 queue2 中这条消息的时候会有特殊的 headers 属性标记。


Shovel 插件使用

Shovel 既可以部署在源端,也可以部署在目的端。

有两种方式可以部署 Shovel:

  • 静态方式(static)

    指在 rabbitmq.config 配置文件中设置。

  • 动态方式(dynamic)

    指通过 Runtime Parameter 设置。

rabbitmq_shovel_management 提供的 Web 管理界面进行设置。其中,有两个 broker,分别为 broker1(192.168.0.175:5772)和 broker2(192.168.0.175:5773),broker1 作为源,broker2 作为目标。broker1 上面创建 Shovel,用户在 broker2 队列上发布消息,将会自动同步到 broker1 的队列中,最后进行消费。

3.1 创建两个broker-a,broker-b

 

 

3.2 broker-a开启shovel

 

 

使用浏览器访问 http://192.168.0.175:15772/地址,点击“Add a new queue”按钮去添加一个queue,如下图:

 

3.3 创建shovel

使用浏览器访问 http://192.168.116.51:15672/#/dynamic-shovels 地址(“Admin”>“Shovel Management”),点击“Add a new shovel”按钮去添加一个 Shovel,如下图:

 

 

上图中,添加了一个名为“shovel-demo”的 Shovel。

其中各个参数含义如下:

  • Name

    表示 Shovel 的名称。

  • Source

    用来定义数据的来源。首先选择的是 AMQP 的协议版本,然后就是进行 URI 的定义。URI 定义有 6 种方式:

  • URI

    定义数据来源的 AMQP URL 地址。例如:amqp://guest:guest@192.168.0.175:5772

  • Prefetch count

    用来指定消息可以从源目标一次传送多少消息给目的目标,默认是1000。

  • Auto-delete

    是否自动删除,默认是 never。never 表示不删除,直到明确的进行删除。after initial length transferred 表示 Shovel 启动时会检查队列的长度,它将传输消息,然后删除自己。

  • Routing key

    如果选择数据源为交换器 exhcange,则这里将设置路由 key。

  • Destination

    目标目的的定义,它与source定义的内容差不多,没有Prefetch count和Auto-delete,多了一个Add forwarding headers,它表示是否向被铲起的消息添加报头,指示它们从何处被铲起,以及从何处被铲起。如果没有设置,则默认为false。 

  • URI

    定义目标地址 AMQP 地址,例如:amqp://guest:guest@192.168.0.175:56773

  • Add forwarding headers

    是否将标头添加到已 Shovel 的消息中,以指示它们已被 Shovel 和 Shovel 的位置。如果未设置,则默认为 false。

  • Routing key

    如果选择交换器 exchange 作为目标,则这里将设置路由 key。

  • Reconnect delay

    一个 Shovel 节点丢失后等待多长时间进行自动重连,默认是1秒。

  • Acknowledgement mode

    消息确认模式,有 on-confirm、on-publish 和 no-ack 三种方式。含义分布如下:

    1)on-confirm 默认的确认方式,它需要在目的目标消息得到确认后才进行源目标消息的删除,是最可靠的消息处理方式。不管是网络错误还是消息节点失败都不会丢失消息,这种方式处理最慢。

    2)on-publish 源目标将消息发送给目的目标消息就进行确认了,这种情况在网络错误时可以进行重发,但是在消息节点失败时会丢失消息。

    3)no-ack 不需要确认就可以进行消息删除。这种方式最不安全对于消息来说,但是却是最快的。

3.4 发布消息

broker-a上的nginx queue Publish message同时broker-b上创建好nginx queue:

 

 

 

3.5 登录broker-b

 

 

标签:交换器,插件,Shovel,队列,Broker,RabbitMQ,消息
From: https://www.cnblogs.com/guarderming/p/18628184

相关文章

  • js平滑的页面滚动效果插件smoothScroll-Es5.js
    smoothScroll-Es5.js是一款js平滑的页面滚动效果插件。通过它可以制作页面锚链接之间的平滑滚动效果,和平滑的返回页面顶部效果等。 在线预览  下载 使用方法在页面中引smoothScroll-ES5.js文件。<scripttype="text/javascript"src="path/to/js/smoothScroll-......
  • 高性能js固定侧边栏插件
    sticky-sidebar.js是一款高性能的js固定侧边栏插件。通过sticky-sidebar.js插件,你可以快速的为网站制作出固定侧边栏效果。在线预览 下载 它的特点还有:在页面滚动是,不需要重新计算所有的坐标,金辉计算必要的坐标。页面平滑滚动,不会产生页面滚动侧边栏滞后的感觉。当侧边......
  • cs插件CrossC2——上线Linux系统
    介绍一款非常强大的cs插件GitHub-gloxec/CrossC2:generateCobaltStrike'scross-platformpayload,cs的可拓展性非常强大,以后会陆续更新各种插件!下载第一个至第三个加载cna文件,然后会出现下面的图标目前只支持反向的HTTPS连接和正向的TCP连接需要把keys文件复制到C......
  • 使用umi的插件功能编写一个自定义插件,实现在打包前去除代码中所有svg图片的title内容
    1.在src下面新建plugins文件夹,并在其中创建你的插件文件,比如removeSvgTitle.js。2.编写插件代码:/**Description:当调用打包命令时,去除代码中所有svg图片的title内容,本地打包会改变源文件,提交会比较多,无其他影响*@Author:aoshilin*@Date:2024-09-2711:23:25*......
  • Blender插件:Asset Management资产管理插件
    hello,我是爱玩的小松鼠!Blender插件:AssetManagement资产管理插件。如下:介绍‌AssetManagementBlender插件‌是一个用于管理和组织Blender中模型、材质、HDRI等资产的工具。该插件提供了便捷的方式来管理和查找项目中的各种资源,极大地提高了工作效率。主要功能‌资产分类......
  • 插件功能页
    插件功能页插件功能页从小程序基础库版本2.1.0开始支持。某些接口不能在插件中直接调用(如wx.login),但插件开发者可以使用插件功能页的方式来实现功能。目前,插件功能页包括:获取用户信息,包括openid和昵称等(相当于wx.login和wx.getUserInfo的功能),详见用户信息功能页;从......
  • vue3 使用拖动插件vuedraggable@next
    下面是一个使用VueDraggableNext的Vue3组件示例。这个示例展示了一个可拖动的列表。安装依赖首先,确保安装了VueDraggableNext:npminstallvuedraggable@next示例组件<template><div><h2>可拖动列表</h2><draggablev-model="items":animation="200&q......
  • js侧边栏菜单插件canvi
    canvi.js是一款js侧边栏菜单插件。canvi.js使用简单,可以快速的制作出侧边栏展开收缩js特效。你可以在同一个页面实例化多个侧边栏实例,还可以设置侧边栏的响应式宽度,自定义侧边栏样式等。在线预览  下载  使用方法在页面中引入canvi.css和canvi.js文件。<link......
  • 我的世界服务端插件安装 AuthMe用户登录插件安装
    Minecraft服务端插件安装-AuthMe用户登录插件安装需要准备AuthMe插件AuthMe-5.6.0.jar用户登录插件例如使用/register<密码><确认密码>进行注册,使用/login<密码>进登录 AuthMe插件AuthMe是一个广泛用于Minecraft服务器的插件,主要用于账户验证和注册流程。......
  • 纯js文字洗牌式切换特效插件
    ShuffleText是一款纯js文字洗牌式切换特效插件。该插件在鼠标滑过指定的文本时,文字会不停的逐个进行翻转,类似洗牌效果,非常炫酷。在线演示 下载 使用方法在页面中引入shuffle-text.js文件。<scriptsrc="path/to/shuffle-text.js"> HTML结构ShuffleText插件基本的HTM......