RabbitMQ 入門系列:3、基礎含義:持久化、排它性、自動刪除、強制性、路由鍵。

RabbitMQ 入門系列:1、MQ的應用場景的選擇與RabbitMQ安裝。

RabbitMQ 入門系列:2、基礎含義:鏈接、通道、隊列、交換機。

RabbitMQ 入門系列:3、基礎含義:持久化、排它性、自動刪除、強制性、路由鍵。

RabbitMQ 入門系列:4、基礎編碼:官方SDK使用:鏈接創建、單例改造、發送消息、接收消息。

RabbitMQ 入門系列:5、基礎編碼:交換機的進階介紹及編碼方式。

RabbitMQ 入門系列:6、保障消息:不丟失:發送方、Rabbit存儲端、接收方。

RabbitMQ 入門系列:7、保障消息:不重複消費:產生消息的唯一ID。

RabbitMQ 入門系列:8、擴展內容:接收資訊時:可否根據RoutingKey過濾監聽資訊,答案是不能。

RabbitMQ 入門系列:9、擴展內容:死信隊列:真不適合當延時隊列。

RabbitMQ 入門系列:10、擴展內容:延時隊列:延時隊列插件及其有限的適用場景。

前言:

本篇介紹:RabbitMQ 後續編碼涉及的基礎含義:持久化、排它性、自動刪除、強制性、路由鍵。

1、持久化:參數名:durable,默認值:false

定義隊列或定義交換機的時候,涉及該參數。

持久化作用說明:

即將相關隊列的消息、或交換機的綁定資訊等內容,寫入硬碟備份,以便系統故障或重啟時,仍可以恢復原來的狀態,保障資訊不丟失。

缺點:

大量的硬碟寫入,會對IO造成不小的影響,因此RabbitMQ的部署環境,應該盡量避免和IO讀寫頻繁的應用在同一磁碟上,比如資料庫等。

示例程式碼:

channel.QueueDeclare("dead",durable:true, false, false);

2、排它性:參數名:exclusive,默認值:true

定義隊列的時候,涉及該參數:

排它性的作用說明:

如果該參數為true,則該隊列僅允許創建它的連接進行寫入或讀取,同時當該鏈接關閉時,該隊列被刪除。

示例程式碼:

 //定義隊列
    channel.QueueDeclare("dead", durable: true, exclusive: true, false);

 

說明:

該參數為true時,持久化參數是無效的,因為鏈接關閉即釋放隊列。

3、自動刪除:參數名:autoDelete,默認值:true

定義隊列的時候,涉及該參數:

自動刪除的作用說明:

如果該參數為true,則最後一名消費者關閉鏈接時,該隊列被刪除。

示例:

1、消費者A監聽隊列,然後關閉鏈接,則隊列被刪除;

2、消費者A監聽隊列、消費者B監聽隊列、消費者C監聽隊列,則當全部鏈接都關閉時,隊列被刪除。

示例程式碼:

    //定義隊列
    channel.QueueDeclare("dead", durable: true, exclusive: true, autoDelete: true);

4、強制性:參數名:mandatory,默認值:false

發布消息的時候,涉及該參數:

強制性的作用說明:

發送的消息,通過交換機,找不到對應隊列時:

如果為false:消息會被丟棄。
如果為true:可以通過BasicReturn回調事件,拿到丟失的數據,進行二次處理。

示例程式碼:

using (var channel = Rabbit.Instance.DefaultConnection.CreateModel())
{
    channel.BasicReturn += (e,a) => { 
    
        //回調事件。
    };
    //定義隊列
    channel.QueueDeclare("dead", durable: true, exclusive: true, autoDelete: true);
 
    channel.BasicPublish("", "dead", mandatory:true, null, Encoding.UTF8.GetBytes("6秒就過期了1。"));

}

5、路由鍵:參數名:routingKey,使用默認路由時,即為隊列名

定義交換機,或者發布消息時,涉及該參數:

路由鍵的作用說明:

1、未定義交換機,使用默認direct方式時,發消息消息時:交換機=空值,routingKey=隊列名。

2、自定義交換機,也設置routingKey時,發布消息的時:填寫對應的交換機名和設置的routingKey。

更多路由鍵的使用,在交換機進隊介紹一文中介紹。

示例程式碼:

using (var channel = Rabbit.Instance.DefaultConnection.CreateModel())
{
    //定義隊列
    channel.QueueDeclare("dead", durable: true, exclusive: true, autoDelete: true);
 
    channel.BasicPublish("", routingKey:"dead", false, null, Encoding.UTF8.GetBytes("6秒就過期了1。"));

}

總結:

本篇介紹RabbitMQ的基礎參數含義,在後續的編碼中,遇到時候,可以反覆回來查看,加深理解。