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

轉載:http://www.cnblogs.com/aarond/p/rabbitmq.html

概述

因爲種種緣由,RabbitMQ到目前爲止,官方尚未實現優先級隊列,只實現了Consumer的優先級處理。html

可是,迫於種種緣由,應用層面上又須要優先級隊列,所以需求來了:如何爲RabbitMQ加入優先級隊列特性。windows

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

地址以下:http://www.rabbitmq.com/community-plugins.htmlide

插件安裝

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

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

 

插件如何安裝?spa

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

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

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

把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的枚舉轉換成bytechannel.BasicPublish("exchange", "route", headers, SerializerUtility.Serialize2Bytes(msg));

  

 其餘注意的地方

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

相關文章
相關標籤/搜索