RabbitMQ消息隊列(十一)-如何實現高可用

RabbitMQ消息隊列(十一)-如何實現高可用

在前面講到了RabbitMQ高可用集羣的搭建,但是我們知道只是集羣的高可用並不能保證應用在使用消息隊列時完全沒有問題,例如如果應用連接的RabbitMQ集羣突然宕機了,雖然這個集羣時可以使用的,但是應用訂閱的連接就斷開了,如果有個機房外網出口帶寬被挖掘機弄斷了,那集羣依然是不可用的。所以我們後面會介紹應用APP如何與連接集羣來保證兩者配合默契,以及如何實現跨機房的集羣複製。

應用連接集羣高可用

前面講到應用服務器通過一個負載均衡服務將連接的流量分發到指定服務器,如果連接的節點宕機怎麼辦呢。應用服務器連接集羣主要做兩件事,訂閱和發佈,所以如果是發佈消息每次都會重新初始化連接所以連接節點的切換對整個系統的可用性影響不大。如果是訂閱消息就沒有真麼簡單了。首先我們要做到如果連接出現問題應該是拋出異常而不是終止腳本,並且這時應該重新連接連接。 
好了不廢話了,代碼如下:

ColonyProduct

 View Code

ColonyConsumer

 View Code

所以通過以上的代碼就可以保證服務器某節點宕機後訂閱的連接自動重連切換。

RabbitMQ集羣異地複製

基於warren的共享存儲模式

這種方式其實並不是跨地區的遠程複製,並且需要共享存儲,如果感興趣的同學可以百度下。

基於Shovel的遠程複製

如果直接基於WAN來組建異地的集羣的話,集羣間大量的數據通訊會產生高昂的費用,另外Erlang也不允許這麼高延遲的通訊。 
Shovel是RabbitMQ自帶插件(2.7.0後),自帶插件的好處就是可以在RabbitMQ服務啓動時自動啓動Shovel和自定義複製關係。 
Shovel運行的原理其實非常簡單。通過定義RabbitMQ上一個隊列和另外一個RabbitMQ上的交換機之間的複製關係來實現遠程複製。也就是說它會在主服務上建立一個隊列來監聽交換機,所以這是到交換機所以的消息會投遞到該隊列,並且在從服務中訂閱這個隊列,使隊列中的消息複製到從服務的交換機中。RabbitMQ是一個比較全面的消息隊列解決方案,我們公司並沒有用到該功能,只是在這提下,感興趣的同學可以搜下。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章