前置文章:
RabbitMQ-消息可靠性&延遲消息
壹、MQ常見問題
二、消息堆積-惰性隊列
1、消息堆積問題
2、解決消息堆積方法
3、惰性隊列
三、高可用-MQ集群
1、集群分類
2、普通集群
3、鏡像集群
4、沖裁隊列
確保發送的消息至少被消費壹次;
實現消息的延遲投遞;
處理消息無法及時消費的問題;
避免單點MQ故障導致整體不可用;
1、消息堆積問題
當生產者發送消息的速度超過了消費者處理消息的速度,就會導致隊列中的消息堆積,直到隊列存儲消息達到上限。最早接收到的消息,可能就會 成為死信 ,會 被丟棄 ,這就是消息堆積問題。
2、解決消息堆積方法
3、惰性隊列
從RabbitMQ的3.6.0版本開始,就增加了Lazy Queues的概念,也就是惰性隊列。
Ⅰ 接收到消息後直接 存入磁盤 而非內存;
Ⅱ 消費者要消費消息時才會 從磁盤中讀取 並加載到內存;
Ⅲ 支持 數百萬條 的消息存儲。
要設置壹個隊列為惰性隊列,只需要在聲明隊列時,指定x-queue-mode屬性為lazy即可。
Ⅰ 可以通過命令行將壹個運行中的隊列修改為惰性隊列,如下:
rabbitmqctl set_policy Lazy "^lazy-queue$" '{"queue-mode":"lazy"}' --apply-to queues
Ⅱ 用SpringAMQP聲明惰性隊列,如下:
@Bean註解的形式,如下:
@RabbitListener註解的形式,如下:
Ⅰ 優點
基於磁盤存儲,消息上限高;
沒有間歇性的page-out,性能比較穩定;
Ⅱ 缺點
基於磁盤存儲,消息時效性會降低;
性能受限於磁盤的IO。
官方文檔: Clustering Guide — RabbitMQ 。
1、集群分類
是壹種 分布式集群 ,將隊列分散到集群的各個節點,從而提高整個集群的並發能力。
是壹種 主從集群 ,普通集群的基礎上,添加了主從備份功能,提高集群的數據可用性。
註意:鏡像集群雖然支持主從,但主從同步並不是強壹致的,某些情況下可能有數據丟失的風險。
在RabbitMQ的3.8版本以後推出的,底層采用Raft協議確保主從的數據壹致性。
2、普通集群
Ⅰ 會在集群的各個節點間***享部分數據,包括:交換機、隊列元信息。不包含隊列中的消息;
Ⅱ 當訪問集群某節點時,如果隊列不在該節點,會從數據所在節點傳遞到當前節點並返回;
Ⅲ 隊列所在節點宕機,隊列中的消息就會丟失。
Ⅰ 獲取Cookie
RabbitMQ底層依賴於Erlang,而Erlang虛擬機就是壹個面向分布式的語言,默認就支持集群模式。集群模式中的每個RabbitMQ 節點使用 cookie 來確定它們是否被允許相互通信。
要使兩個節點能夠通信,它們必須具有相同的***享秘密,稱為 Erlang cookie 。cookie 只是壹串最多 255 個字符的字母數字字符。
每個集群節點必須具有 相同的 cookie 。實例之間也需要它來相互通信。
首先獲取Cookie,指令如下:
其中 YYNCLCJEKVNUFYQFPNZH 這壹串就是生成的Cookie,如下:
Ⅱ 刪除現有mq容器
Ⅲ 準備rabbitmq.conf配置文件
此處選擇在tmp目錄下創建,如下:
配置文件內容如下:
Ⅳ 準備Cookie記錄文件
Ⅴ 準備集群目錄
Ⅵ 拷貝配置文件、Cookie文件到目錄
echo :用於字符串的輸出,輸出字符串到 | 後面;
-t :表示先打印命令,再執行;
-n 1 :表示執行命令時用的args個數為1個。
Ⅶ 創建集群網絡
Ⅷ 運行容器
集群中的節點標示默認都是: rabbit@[hostname] 。
Ⅰ 往rabbit@mq1添加隊列
在mq2、mq3中也可以查看到該隊列,因為元信息***享。
Ⅱ 往simple.queue添加數據
在mq2、mq3中可以查看到消息,如下:
Ⅲ 讓mq1宕機
mq2、mq3無法讀取到數據,因為只***享元信息,沒有同步備份數據,如下:
3、鏡像集群
鏡像集群官方文檔: Classic Queue Mirroring — RabbitMQ 。
普通集群不具備高可用的特性,使用鏡像集群可以解決這個問題。
Ⅰ 鏡像隊列結構是壹主多從(從就是鏡像);
Ⅱ 所有操作都是主節點完成,然後同步給鏡像節點;
Ⅲ 主宕機後,鏡像節點會替代成新的主(如果在主從同步完成前,主就已經宕機,可能出現數據丟失);
Ⅳ 不具備負載均衡功能,因為所有操作都會有主節點完成(但是不同隊列,其主節點可以不同,可以利用這個提高吞吐量)。
Ⅰ 設置exactly模式
Ⅱ 創建隊列
Ⅲ 發送消息
Ⅳ 讓mq1宕機
註意:mq1恢復後,該隊列的主節點仍然為mq3。
4、沖裁隊列
Ⅰ 與鏡像隊列壹樣,都是主從模式,支持主從數據同步;
Ⅱ 使用非常簡單,沒有復雜的配置;
Ⅲ 主從同步基於Raft協議,強壹致。
註意:仲裁隊列是3.8版本以後才有的新功能。
+2表示有2個鏡像節點,仲裁隊列默認鏡像數為5,集群節點不足5則都是鏡像。
@Bean註解配置
修改配置文件
以上即為RabbitMQ-消息堆積&高可用的全部內容,感謝閱讀。