如何基於RabbitMQ實現優先級隊列


概述

由於種種原因,RabbitMQ到目前為止,官方還沒有實現優先級隊列,只實現了Consumer的優先級處理。

但是,迫於種種原因,應用層面上又需要優先級隊列,因此需求來了:如何為RabbitMQ加入優先級隊列特性。

查詢資料后,得知RabbitMQ雖然官方沒有支持此特性,但是社區已經有相關優先級隊列插件了,並且這個插件被列在RabbitMQ官方網站中了。

地址如下:http://www.rabbitmq.com/community-plugins.html

插件安裝

不要立刻下載這個url中的那個鏈接,要先根據你想要更新目標的rabbitmq版本再去另外一個地方下載相應插件,如:

會列出兩大版本的插件目錄(選擇對應目錄進入下載,否則會報錯...):

 

插件如何安裝?

進入rabbitmq安裝目錄,進入plugins目錄,將上面這個ez文件拷貝到plugins目錄中,然后運行命令來enable這個插件

centos下,默認路徑在:/usr/lib/rabbitmq/lib/rabbitmq_server-3.3.4/plugins(版本號可能會變化)

windows下,默認路徑在:C:\Program Files\RabbitMQ Server\rabbitmq_server-3.3.4\plugins(版本號可能會變化)

把ez文件拷貝過去,然后運行列舉插件列表命令:

找到這個優先級隊列插件名為:rabbitmq_priority_queue

執行:rabbitmq-plugins enable rabbitmq_priority_queue

ok,重新啟動rabbitmq-server服務。

這樣,server端的配置算完成了。

 

C#代碼端需要作出的更改

下面看看客戶端類庫的編寫:

我們先要定義優先級枚舉,繼承自byte,因為RabbitMQ的C#客戶端優先級是用byte來傳遞的:

先定義3個級別的優先級:低、中、高(其實可以定義很多級別,只是為了簡化,因此只定義了3個級別)

有2個地方需要改動:

    1. 申明隊列時需要加入自定義的屬性
    2. 發送消息到rabbitmq時,設置自定義屬性

 

internal static IDictionary<string, object> QueueArguments
        {
            get
            {
                IDictionary<string, object> arguments=new Dictionary<string, object>();
                arguments["x-max-priority"] = 10;//定義隊列優先級為10個級別 return arguments;
            }
        }

  

channel.QueueDeclare("queueName", true, false, false, QueueArguments);//QueueArguments就是上面定義的這個dictionary

  

var headers = channel.CreateBasicProperties();

headers.Priority = (byte)msg.Priority;//在這里把繼承自byte的枚舉轉換成byte

channel.BasicPublish("exchange", "route", headers, SerializerUtility.Serialize2Bytes(msg));

  

 其他注意的地方

在裝了優先級隊列插件的rabbitmq-server實例中,所有的Durable隊列必須用如上的方式,設置x-max-priority屬性,否則rabbitmq-server服務會crash

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM