原文地址:https://www.jianshu.com/p/4b8cc505a69b
rabbitmq的shovel功能
很多時候線上rabbitmq的隊列會出現消息堆積,消息堆積的時候可以通過后期優化代碼邏輯或者增加消費者的實例數去解決。
但是后期的代碼優化在面臨緊急情況時總歸是“遠水解不了近渴”,並且有些業務場景也井非可以簡單地通過增加消費實例而得以增強消費能力。
在一籌莫展之時,不如試一下 Shovel 。當某個隊列中的消息堆積嚴重時,比如超過某個設定的闌值,就可以通過 Shovel 將隊列中的消息移交給另一個集群。
1、shovel是什么
Shovel 夠可靠、持續地從一個 Broker 中的隊列(作為源端 ,即 source )拉取數據並轉發至另一個 Broker 中的交換器(作為目的端,即 destination )。
作為源端的隊列和作為目的端的交換器可以同時位於同一個 Broker ,也可以位於不同的Broker 上。
Shovel 可以翻譯為“鏟子”,是一種比較形象的比喻,這個“鏟子”可以將消息從一方“挖到”另一方。
2、shovel的原理
如上圖
shovel就是通過amqp協議,把一個實例隊列里面的消息轉發到另外一個實例的交換機。
message通過exchange1->queue1->exchange2->queue2的路徑達到。
3、shovel的使用
3.1. 創建兩個rabbitmq的實例
在機器1執行命令
docker run -d --hostname rabbit1 --net=host --name myrabbit1 rabbitmq:3.6.15-management
在機器1執行命令
docker run -d --hostname rabbit3 --net=host --name myrabbit3 rabbitmq:3.6.15-management
3.2. 開啟插件
在機器3執行命令進入容器
docker exec -it myrabbit3 /bin/bash
執行命令開啟插件
rabbitmq-plugins enable rabbitmq_shovel_managementt
開啟后,控制台會多兩個菜單
3.3. 新建隊列和交換機
在機器1新建eujian.queue1隊列、eujian.exchange1交換機、和他們之間的綁定。
這里使用命令行去新建(可以用管理后台自行新建)
docker exec -it myrabbit1 /bin/bash
進入docker 容器
rabbitmqctl eval 'rabbit_amqqueue:declare({resource, <<"/">>, queue, <<"eujian.queue1">>}, true, false, [], none).'
rabbitmqctl eval 'rabbit_exchange:declare({resource, <<"/">>, exchange, <<"eujian.exchange1">>}, fanout, true, false, false, []).'
rabbitmqctl eval 'rabbit_binding:add({binding, {resource, <<"/">>, exchange, <<"eujian.exchange1">>}, <<"*">>, {resource, <<"/">>, queue, <<"eujian.queue1">>}, []}).'
在機器3新建eujian.queue3隊列、eujian.exchange3交換機、和他們之間的綁定。
這里使用命令行去新建(可以用管理后台自行新建)
rabbitmqctl eval 'rabbit_amqqueue:declare({resource, <<"/">>, queue, <<"eujian.queue3">>}, true, false, [], none).'
rabbitmqctl eval 'rabbit_exchange:declare({resource, <<"/">>, exchange, <<"eujian.exchange3">>}, fanout, true, false, false, []).'
rabbitmqctl eval 'rabbit_binding:add({binding, {resource, <<"/">>, exchange, <<"eujian.exchange3">>}, <<"*">>, {resource, <<"/">>, queue, <<"eujian.queue3">>}, []}).'
3.4. 新建shovel
在機器3執行命令創建shovel
rabbitmqctl set_parameter shovel myshovel '{"src-uri":"amqp://guest:guest@192.168.2.139:5672","src-queue":"eujian.queue1","dest-uri":"amqp://guest:guest@192.168.2.138:5672","dest-exchange":"eujian.exchange3","src-exchange-key":"*","prefetch-count":64,"reconnect-delay":5,"publish-properties":[],"add-forward-headers":true,"ack-mode":"on-confirm"}'
這里ip改成自己的rabbitmq實例ip。
這里可以用管理台頁面去創建shovel。
3.5. 驗證
在機器1的rabbitmq的eujian.exchange1發送消息。
然后看到機器3的eujian.queue3