有時候,因爲各方面緣由好比安全緣由、系統間隔離,咱們須要實如今多個rabbitmq實例或者一個rabbitmq實例的多個vhost間推送消息。在上一版的實現中,公司使用java自行實現了一個相似轉發器的功能,其結構爲:html
內部MQ->java-pusher->外部MQjava
其中在java-pusher的配置文件裏面定義內部MQ和外部MQ各隊列之間的映射關係。這樣作除了額外的開發和維護成本外,必定程度還增長了系統資源的消耗。最近在測試rabbitmq cluster的各類異常恢復時,發現其提供了一個原生的 實現級聯功能的插件shovel,雖然他被歸爲HA一類,但實際上應該還算不上。web
shovel能夠在rabbitmq.config中配置,也能夠經過web控制檯進行配置。安全
同其餘插件好比trace同樣,首先須要啓用插件自身以及相應的管理插件。測試
[root@iZ23nn1p4mjZ bin]# rabbitmq-plugins enable rabbitmq_shovel
[root@iZ23nn1p4mjZ bin]# rabbitmq-plugins enable rabbitmq_shovel_management
Plugin configuration unchanged.插件
Applying plugin configuration to rabbit@iZ23nn1p4mjZ... nothing to do.code
啓用後在控制檯Admin頁面就多了兩個tab,以下:htm
除此以外,rabbitmq還支持exchange 2 exchange的綁定,這樣能夠在不引入shovel的前提下,實現更爲靈活的路由策略,以下:blog
java中綁定:rabbitmq
Channel ch = conn.createChannel(); ch.exchangeBind("destinationExch", "sourceExch", "routingKey");
此時,消費者獲得的exchange仍然是發佈時的exchange,後需通過的exhange不會修改原始exhcange。
不過,要是用的是rpc模式,就不知道shovel是什麼結果了。
參考:
https://www.rabbitmq.com/shovel.html#management-status
http://www.rabbitmq.com/blog/2010/10/19/exchange-to-exchange-bindings/
https://www.zhihu.com/question/41976893
https://www.rabbitmq.com/shovel.html