rabbitMQ插件shovel配置(数据同步)

扣扣技术分享交流群:1125844267

一、shovel是什么?

其实,shovel和上一篇博客中的federation的功能是类似的,都是为了MQ间的消息同步。不同的是,federation需要每个MQ上都配置,它只是个拉取消息的功能,而shovel只需要在一个MQ上配置即可,它是个双向的动作,既能拉取消息,也能推送消息,所以只需要知道一台服务器ip就能实现双向通信,这在某些特定的场景下是特别适合的,比如有一台服务器的ip是不确定的。

一般情况下都是一个MQ的队列和另一个MQ的交换机进行通信,当然这也不是必须的,只是普遍这么使用。通过配置证明,队列与队列、队列与交换机、交换机与交换机都是可以实现通信的,只是需要注意的一个原则是,队列是不保存消息的,交换机是本地保存消息的。比如队列收到了消息,然后直接就转发到配置的下游,本队列中是不保存消息,而交换机除了转发走,还要本地保存,可以本地队列消费。

二、优势

1、松耦合。shovel可以移动位于不同管理域中的Broker(或者集群)上的消息,这些Broker(或者集群)可以包含不同的用户和虚拟主机,也可以使用不同的RabbitMQ和Erlang版本;

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

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

三、使用步骤

1.安装rabbitMQ

(1)yum安装,最简单

(2)rpm安装

2.开始服务

systemctl start rabbitmq-server

3.创建用户

rabbitmqctl add_user test test

4.设置角色

rabbitctl set_user_tags test administrator

5.检查用户

rabbitmqctl list_users

6.启动插件管理

rabbitmq-plugins enable rabbitmq_management

7.启动shovel和shovel_management插件

rabbitmq-plugins enable rabbitmq_shovel

rabbitmq-plugins enable rabbitmq_shovel_management

8.配置

shovel有两种配置方式,一种是静态方式,修改rabbitmq.config配置文件,另外一种是动态方式,通过修改动态参数来实现配置,可以用命令,也可以在web管理页面进行配置,我们直接利用web管理页面进行配置。至于第一种配置方式这里不做介绍。

登录web管理页面http://ip:15672,test用户登录,右侧会多出两个菜单

点击shovel management进行配置

Virtual host:虚拟主机;

Name:shovel名称;

Source:源端amqp地址,amqp://用户名:密码@ip:端口/虚拟主机,源端可以选择是队列或者是交换机

Destination:目标端amqp地址,amqp://用户名:密码@ip:端口/虚拟主机,目标端可以选择是队列或者是交换机

Prefetch count:一次可能在铲子上传播的未确认消息的最大数量。 如果未设置,则默认为1000。其实就是Shovel 内部缓存的消息条数,Shovel 的内部缓存是源端服务器和目的端服务器之间的中间缓存部分;

Reconnect delay:当源端或者目标端连接失效后,在几秒后重新连接;

Add forwarding headers:添加转发头,在获取信息时会多个特殊的头信息;

Acknowledgement mode:三种消息确认机制

no ack 表示无须任何消息确认行为;on publish 表示 Shovel 会把每条消息发送到目的端之后再向源端发送消息确认;on confirm 表示 Shovel 会使用 publisher confirm 机制,在收到目的端的消息确认之后再向源端发送消息确认。 Shovel ack mode 默认也是on confirm ,并且官方强烈建议使用该值。如果选择使用其他值,整体性能虽然会有略微提升,但是发生各种失效问题的情况时,消息的可靠性得不到保障;

Auto-delete:是否自动删除铲子;

状态如果是running表示配置正确,如果配置有问题,会有错误提示

大概有三种方式:

1、队列与队列间通信(消息直接从队列转发另外一个队列,本队列不保存消息)

MQ1                                                MQ2

队列1------------------------------------->队列2

队列3<-------------------------------------队列4

绝对不允许(会导致死循环,队列上的消息一直增加):

队列1<------------------------------------>队列2

2、队列与交换机通信

如果是从队列将信息推送到交换机,队列中不保存信息;如果是从交换机拉去信息,交换机保存信息。总的原则就是交换机会保存信息,队列直接转发,本地不保存。

MQ1                                                MQ2

队列1------------------------------------->交换机2

队列3<-------------------------------------交换机4

绝对不允许(会导致死循环,队列上的消息一直增加):

队列1<------------------------------------>交换机2

3、交换机与交换机通信

只要涉及到交换机,交换机就会保存信息

MQ1                                                    MQ2

交换机1------------------------------------->交换机2

交换机3<-------------------------------------交换机4

绝对不允许(会导致死循环,队列上的消息一直增加):

交换机1<------------------------------------>交换机2

9、实际中遇到的问题

1、补充一张实际中配置的图,在配置时看自己之前博客的记录竟然不知道怎么操作了

注意:%2F是代表默认的虚拟主机,在配置的时候,URL写全路径,写到虚拟主机,队列中只写队列

 2、不管是配置了shovel还是客户端(代码程序服务)连接rabbitmq服务发送、同步消息都使用一个端口就行,默认是5672,可以自己修改,在/etc/rabbitmq/rabbitmq.config,

{tcp_listeners,[5672,45672]},只是配置多个的写法。我们可以把默认的改成{tcp_listeners,[45672]},这样我们程序连接和shovel同步消息都可以用这个端口,不必配置多个。开始程序连接配置了45672,后来要配置shovel的时候又加了个5672的默认端口,后来回想了一下,感觉没必要配置两个端口,测试了一下,就用一个就可以

3、在实际使用过程中,因为这个插件的原因会心跳超时导致rabbitmq时不时的挂掉,没有找到很好的办法,只能写个脚本去监测rabbitmq进程,在未找到的情况下,重新启动rabbitmq服务。脚本如下,根据自己的实际情况适当调整:

#!/bin/bash
#rabbitmq_server-3.7.18根据自己实际情况做修改
PID=$(ps -ef | grep rabbitmq_server-3.7.18 | grep -v grep | awk '{ print $2 }')
if [ -z "$PID" ]
then 
        echo 'rabbitmq is stop'
        #启动rabbitmq,根据自己的实际命令执行
        /usr/sbin/rabbitmq-server -detached
        echo 'rabbitmq restarting'
else 
        echo 'rabbitmq is running'
fi

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Happy-Sir

有收获请打赏,哈哈

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值