rabbitmq之shovel插件如何使用及注意事项
rabbitmq之shovel插件如何使用及注意事项
此篇文章本来发表在我厂内部文档库中,由于本人年后准备异动,现将此文转出此本人私有站点中
Shovel是分布式消息传递工具包中的一种极简但灵活的工具,可以容纳许多用例。
以下是官网列举的四项功能:
- 可以应对不同的平台进行消息传递,藕合性低。
- 可以在RabbitMQ的不同版本上运行,兼容性强。
- 可使用不同的消息传递产品或协议。
- 可使用不同的用户和虚拟主机进行传输对接,包容性好。
shovel 插件工作原理
Shovel是RabbitMQ的一个插件,这个插件的功能就是将源节点的消息发布到目标节点,这个过程中Shovel就是一个客户端,它负责连接源节点,读取某个队列的消息,然后将消息写入到目标节点的exchange/queue中。根据这么一个概念,其实也可以自己开发一个简单的程序,负责从一个节点读取数据然后发送到目标节点。
本质上,shove就像一个消息泵,它主要做了以下的事情:
- 连接集群源节点和目标节点
- 从队列中消费消息
- 重新发布消息到目标节点
- 在两端使用数据安全功能保障数据安全,并处理故障
相当于一个中转站,将消息中转到另一端。
shovel 如何使用
安装:
只要进入rabbitmq后台,安装:
rabbitmq-plugins ``enable` `rabbitmq_shovel``rabbitmq-plugins ``enable` `rabbitmq_shovel_management
注意,源节点和目标节点都要安装此插件。
然后在后台控制台管理页设置:
注意:必须将shovel设置在目标集群方向,可以保证消息不丢失。
配置说明
- Name:该Shovel配置的名称
- Source:Source中需要指定协议类型、连接的源节点地址,源端的类型(队列、交换器,如果是交换器还需要填入routingKey)
- Prefetch count:该参数表示Shovel内部缓存的消息条数,可以参考Federation的相关参数。Shovel的内部缓存是源端服务器和目的端服务器之间的中间缓存部分
- Auto-delete:默认为Never表示不删除自己,如果设置为After initial length transferred,则再消息转移完成后删除自己。
- Destination:Destination需要指定协议类型,连接的目的节点地址,目的端的类型(队列、交换器,如果是交换器还需要填入routingKey)
- Add forwarding headers:如果设置为true,则会在转发的消息内添加x-shovelled的header属性
- Reconnect delay:指定在Shovel link失效的情况下,重新建立连接前需要等待的时间,单位为秒。如果设置为0,则不会进行重连动作,即Shovel会在首次连接失效时停止工作。默认为1秒。
- Acknowledgement mode:参考Federation的配置。no ack表示无须任何消息确认行为;on publish表示Shovel会把每一条消息发送到目的端之后再向源端发送消息确认; on confirm表示Shovel会使用publisher confirm机制,在收到目的端的消息确认之后再向源端发送消息确认。
注意:
- 必须将Acknowledgement mode 设置成:on publish , 否则消息转输会很慢,因为如果是on conform的话,它会等待源回应后才会往下转,会很慢
- source和Destination的协议版本都填0.9.1
- prefetch count 没有特殊要求,不要填(默认是1000)
- Reconnect deplay 填5s,如果觉得1s也够的也可不填(默认是1s)
- auto delete 为nerver
**
**
source 和Destination的内容规则:
amqp://[用户名:密码]@[连接地址:5672]/[vhost]
**
**
例子:
amqp://test:test@xxx.com:5672/test
**
**
各团队中的使用配置规则
**
**
根据各自不同业务要求,进行shovel配置,以下列出不同使用场景:
**
**
- 源已经有消费者的,但需要将生产者的所有消息分发给目标集群的
source 到 *Destination 的类型应该配置成,exchange ——> exchange*
*这样两个集群的各自消费相互不影响*
\2. 源有消费者,但源的消费者消费能力有限,希望分发给其它集群帮助消费
source 到 *Destination 的类型应该配置成,queue ——> exchange*
*
*
*3. 源无消费者,但希望将源的队列实时转移到目标集群的队列中进行消费*
source 到 *Destination 的类型应该配置成,queue ——> queue*
4. 源有消费者,但希望将源消息转存到目标集群,目标集群只做持久化或者延后消费
source 到 *Destination 的类型应该配置成,exchange ——> queue*
*
*
*
*