RabbitMQ隊列的屬性

在之前使用RabbitMQ的時候,如果對其隊列不是特別清楚的話,可能在一些操作時會產生一定的疑問,如我們在RabbitMQ的消費者端時,首先創建了一個隊列,然後綁定了一個路由鍵,如下:
在這裏插入圖片描述

上述就是我們之前介紹RabbitMQ的時候,最經常使用的方式,但是假設上述我們發現我們一不小心寫錯了,該隊列應該綁定的路由鍵是bxs2,然後我們就將上述代碼修改完後,再次重新啓動,這時我們就會發現上述代碼不僅獲取到bxs2路由鍵的消息,而且也獲取到了bxs1的消息。


因爲上述在創建隊列時,其中的參數autoDelete=false,所以當消費者斷開連接時,隊列不會被刪除,之前綁定的路由鍵bxs1仍然有效,所以我們需要進行對其解綁,如下:
在這裏插入圖片描述

或者我們在RabbitMQ的控制檯頁面將該隊列進行手動刪除也可,當然我們也是可以將該隊列設置爲自動刪除隊列的,如下:


自動刪除隊列

如果我們將其上述參數autoDelete置爲 true 的話,那麼當消費者斷開連接時,隊列將會被刪除。自動刪除隊列允許的消費者沒有限制,也就是說當這個隊列上最後一個消費者斷開連接纔會執行刪除。
在這裏插入圖片描述


另外之前有時我們自己沒有進行定義其隊列進綁定的話,而是直接獲取系統的隨機隊列,該隊列缺省就是自動刪除的。
在這裏插入圖片描述



單消費者隊列

從上述截圖我們發現,在創建隊列時,還存在其他參數,這裏我們再來看看exclusive參數,該參數表示該隊列是否爲單消費者隊列。


之前我們介紹過一個隊列是可以有多個消費者進行消費的,其消息會輪詢發送給所有的消費者,如果我們在創建隊列時設定屬性exclusivetrue,即可設置隊列爲排他性隊列,即單消費者隊列
在這裏插入圖片描述

其中比較有意思的就是,設置exclusive=true其實並不是嚴格意義上的單消費者隊列,也就是說該隊列就算設置了exclusive=true,有些情況也是可以被多個消費者進行消費者的,如我們在RabbitMQ的基礎使用 —— Direct模式(二)中介紹的同一個連接中不同信道的消費者對同一隊列的消費,還有在RabbitMQ的QOS預取模式中提到的同一信道中不同消費者對同一隊列的消費。


因爲隊列設置了exclusive=true,只對首次聲明它的連接(Connection)可見,只要是當前connection下的信道都可以訪問,所以是基於連接的。一旦該隊列被聲明,其他連接無法聲明相同名稱的排他隊列。


另外單消費者隊列在連接斷開時(注意不是信道斷開)也會被自動刪除,即使隊列聲明爲持久化隊列durable=true也是無效的。



持久化隊列

持久化隊列和非持久化隊列的區別是,持久化隊列會被保存在磁盤中,固定並持久的存儲,當RabbitMQ服務重啓後,該隊列仍會保持原來的狀態在RabbitMQ中被管理,而非持久化隊列不會被保存在磁盤中,Rabbit服務重啓後隊列就會消失。


非持久化比持久化的優勢就是,由於非持久化不需要保存在磁盤中,所以使用速度就比持久化隊列快。即非持久化的性能要高於持久化。而持久化的優點就是會一直存在,不會隨服務的重啓或服務器的宕機而消失。


在聲明隊列時,將屬性durable設置爲 false,則該隊列爲非持久化隊列,若設置成 true 時,該隊列就爲持久化隊列
在這裏插入圖片描述



隊列其他參數設置

另外我們在上述介紹中,在channel.queueDeclare()方法中還有一個參數arguments參數沒有進行介紹,這個參數其實我們在RabbitMQ死信交換器中,已經介紹過了,不過該參數還不僅可以用來設置死信交換器,其還有更多的隊列控制參數,如下:

參數名 說明
x-dead-letter-exchange 死信交換器
x-dead-letter-routing-key 死信消息的可選路由鍵
x-expires 隊列在指定毫秒數後被刪除
x-ha-policy 創建HA隊列
x-ha-nodes HA隊列的分佈節點
x-max-length 隊列的最大消息數
x-message-ttl 毫秒爲單位的消息過期時間,隊列級別
x-max-priority 最大優先值爲255的隊列優先排序功能

其用法其實和我們之前使用的RabbitMQ死信交換器類似,這裏我們就再來看看其隊列的過期時間x-expires,以及隊列消息的過期時間x-message-ttl,如下:
在這裏插入圖片描述

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