場景
現有節點Node1和Node2,建立Exchange:yu.exchange,創建隊列yu1.queue鏡像隊列master位於Node1,yu2.queue鏡像隊列位於Node2,使用topic模式綁定到Exchange;
當隊列發送時設置DeliveryMode=1 No-Persistent 不進行度列持久化時
過程:
1.客戶端向Exchange發送消息10條,停掉Node1上的RabbitMQ實例,隊列yu1.queue將master切換到Node2,隊列正常繼續接受,不影響后續的消息接收。(當前消息條數10)
2.客戶端繼續發送消息5條,然后啟動Node1實例,Node1會以從節點的身份恢復到集群中(當前消息條數15條),Node1會以從節點的身份恢復到集群中,此時隊列上顯示消息不一致“+0+1”的警告,即發生主從消息不一致
3.客戶端繼續發送消息5條(此時隊列內消息為20條),此時隊列上依然顯示消息不一致“+0+1”的警告
4.暫停Node2實例,此時隊列會全部切換master到Node2,隊列正常運行,但此刻隊列消息條數為5,由於只剩一個節點,所以不再存在消息不一致的“+0+1”警告
5.客戶端繼續發送5條,啟動Node1實例,隊列內消息為10條,繼續隊列上顯示消息不一致“+0+1”的警告,即發生主從消息不一致(隊列條數10)
小結:對於未設置持久化的消息隊列,如果無訂閱客戶端進行消息消費的話,當發生主從切換時,master實例在關閉到重啟為slaver的過程中,如果隊列持續接收消息會發生不一致的警告。同時如果該場景重復發生,如果不設置參數“ha-sync-mode: automatic”的話(默認為ha-sync-mode: manual),隊列內消息不會進行同步,消息內容以最近master實例內的消息為主。(https://www.rabbitmq.com/admin-guide.html)
當隊列發送時設置DeliveryMode=2 Persistent 進行度列持久化時
1.客戶端向Exchange發送消息10條,停掉Node1上的RabbitMQ實例,隊列yu1.queue將master切換到Node2,隊列正常繼續接受,不影響后續的消息接收。(當前消息條數10)
2.客戶端繼續發送消息5條,然后啟動Node1實例,Node1會以從節點的身份恢復到集群中(當前消息條數15條),Node1會以從節點的身份恢復到集群中,此時隊列上顯示消息不一致“+0+1”的警告,即發生主從消息不一致
3.客戶端繼續發送消息5條(此時隊列內消息為20條),此時隊列上依然顯示消息不一致“+0+1”的警告
4.暫停Node2實例,此時隊列會全部切換master到Node2,隊列正常運行,但此刻隊列消息條數為0!!!!,由於只剩一個節點,所以不再存在消息不一致的“+0+1”警告
5.客戶端繼續發送5條,啟動Node1實例,隊列內消息為5條,繼續隊列上顯示消息不一致“+0+1”的警告,即發生主從消息不一致(隊列條數5)
6.再次關閉Node2實例,master又會切回到Node1,但此處隊列內消息再次歸0!!!!
當鏡像隊列部署到多於兩個節點時需要注意ha-mode的參數設置 鏡像隊列數量越少處理速度越快,多一些當然數據的一致性會更高,但吞吐量會下降