体验Rabbitmq强大的【优先级队列】之轻松面对现实业务场景
?? ? ? ?說(shuō)到隊(duì)列的話,大家一定不會(huì)陌生,但是扯到優(yōu)先級(jí)隊(duì)列的話,還是有一部分同學(xué)是不清楚的,可能是不知道怎么去實(shí)現(xiàn)吧,其實(shí)呢,,,這東西已經(jīng)爛大街了。。。很簡(jiǎn)單,用“堆”去實(shí)現(xiàn)的,在我們系統(tǒng)中有一個(gè)訂單催付的場(chǎng)景,我們客戶的客戶在tmall,taobao下的訂單,taobao會(huì)及時(shí)將訂單推送給我們,如果在用戶設(shè)定的時(shí)間內(nèi)未付款那么就會(huì)給用戶推送一條短信提醒,很簡(jiǎn)單的一個(gè)功能對(duì)吧,但是,tmall商家對(duì)我們來(lái)說(shuō),肯定是要分大客戶和小客戶的對(duì)吧,比如像施華蔻,百雀林這樣大商家一年起碼能夠給我們貢獻(xiàn)幾百萬(wàn),所以理應(yīng)當(dāng)然,他們的訂單必須得到優(yōu)先處理,而曾經(jīng)我們的后端系統(tǒng)是使用redis來(lái)存放的定時(shí)輪詢,大家都知道redis只能用List做一個(gè)簡(jiǎn)簡(jiǎn)單單的消息隊(duì)列,并不能實(shí)現(xiàn)一個(gè)優(yōu)先級(jí)的場(chǎng)景,所以訂單量大了后采用rabbitmq進(jìn)行改造和優(yōu)化,如果發(fā)現(xiàn)是大客戶的訂單給一個(gè)相對(duì)比較高的優(yōu)先級(jí),否則就是默認(rèn)優(yōu)先級(jí),好了,廢話不多說(shuō),我們來(lái)看看如何去設(shè)置。?
一:優(yōu)先級(jí)隊(duì)列
既然是優(yōu)先級(jí)隊(duì)列,那么必然要在Queue上開一個(gè)口子貼上一個(gè)優(yōu)先級(jí)的標(biāo)簽,為了看怎么設(shè)置,我們用一下rabbitmq的監(jiān)控UI,看看這個(gè)里面是如何
手工的創(chuàng)建優(yōu)先級(jí)隊(duì)列。
? ? ? 從這個(gè)圖中可以看到在Arguments欄中有特別多的小屬性,其中有一項(xiàng)就是"Maximum priority",這項(xiàng)的意思就是說(shuō)可以定義優(yōu)先級(jí)的最大值,其實(shí)
想想也是,不可能我們定義的優(yōu)先級(jí)是一個(gè)非常大的數(shù)字,比如int.MaxValue,大多情況下都是10以內(nèi)的數(shù)字就可以了,再或者我們?cè)窠佑|過(guò)的 MSMQ,
它的優(yōu)先級(jí)只是一些枚舉值,什么High,Normal,Low,不知道大家可否記得? 下面來(lái)看下代碼中該如何實(shí)現(xiàn)呢????
1. 在Queue上附加優(yōu)先級(jí)屬性
Dictionary<string, object> dic = new Dictionary<string, object>(); dic.Add("x-max-priority", 20); channel.QueueDeclare(queue: "hello",durable: true,exclusive: false,autoDelete: false,arguments: dic);?上面的代碼做了一個(gè)簡(jiǎn)單的隊(duì)列聲明,queuename="hello",持久化,排外。。。然后把"x-max-priority"塞入到字典中作為arguments參數(shù),看起來(lái)還
是非常簡(jiǎn)單吧~~~?
2. 在Message上指定優(yōu)先級(jí)屬性
var properties = channel.CreateBasicProperties();properties.Priority = 1;channel.BasicPublish(exchange: "",routingKey: "hello",basicProperties: null,body: body);?
通過(guò)上面的代碼可以看到,在Message上設(shè)置優(yōu)先級(jí),我是通過(guò)在channel通道上設(shè)置Priority屬性,之后塞到basicProperties中就可以了,好了,有上面這兩
個(gè)基礎(chǔ)之后,下面就可以開始測(cè)試了,準(zhǔn)備向rabbitmq推送10條記錄,其中第5條的優(yōu)先級(jí)最高,所以應(yīng)該首先就print出來(lái),如下圖:
static void Main(string[] args) { ? ?var sb = new StringBuilder(); ? ?? ?for (int i = 0; i < 11; i++){sb.Append(i);} ?
? ?var factory = new ConnectionFactory() { HostName = "192.168.23.136", UserName = "datamip", Password = "datamip" }; ?
? ?using (var connection = factory.CreateConnection()){ ? ? ?
? ? ? ?using (var channel = connection.CreateModel()){channel.ExchangeDeclare(exchange: "mydirect", type: ExchangeType.Direct, durable: true);Dictionary<string, object> dic = new Dictionary<string, object>();dic.Add("x-max-priority", 20); ? ? ?
? ? ? ? ? ?for (int i = 0; i < 10; i++){channel.QueueDeclare(queue: "hello",durable: true,exclusive: false,autoDelete: false,arguments: dic); ? ? ? ? ? ? ?
? ? ? ?string message = string.Format("{0} {1}", i, sb.ToString()); ? ? ? ? ? ? ? ?
var body = Encoding.UTF8.GetBytes(message); ? ? ? ? ? ? ? ?var properties = channel.CreateBasicProperties();properties.Priority = (i == 5) ? (byte)10 : (byte)i;channel.BasicPublish(exchange: "",routingKey: "hello",basicProperties: properties,body: body);Console.WriteLine(" [x] Sent {0}", i);}}}Console.WriteLine(" Press [enter] to exit.");Console.ReadLine(); }
?
圖中可以看到10條消息我都送到rabbitmq中去了,接下來(lái)打開consume端,來(lái)看看所謂的index=5 是否第一個(gè)送出來(lái)??
static void Main(string[] args) { ? ?? ?for (int m = 0; m < int.MaxValue; m++){ ? ?
? ? ? ?var factory = new ConnectionFactory() { HostName = "192.168.23.136", UserName = "datamip", Password = "datamip" }; ? ? ?
? ? ?using (var connection = factory.CreateConnection()) ? ? ? using (var channel = connection.CreateModel()){ ? ? ? ?
? ? ? ?var result = channel.BasicGet("hello", true); ? ? ? ? ?? ?if (result != null){ ? ? ? ? ?
? ? ? ? ?var str = Encoding.UTF8.GetString(result.Body);Console.WriteLine("{0} ?消息內(nèi)容 {1}", m, str);System.Threading.Thread.Sleep(1);}}}Console.WriteLine(" Press [enter] to exit.");Console.ReadLine(); }
?
一切都是這么的完美,接下來(lái)為了進(jìn)行可視化驗(yàn)證,你可以在WebUI中觀察觀察,可以發(fā)現(xiàn)在Queue上面多了一個(gè) Pri 標(biāo)記,有意思吧。
?
?
好了,這么重要的功能,是不是已經(jīng)讓你足夠興奮啦, 希望大家能夠好好的在實(shí)際場(chǎng)景中運(yùn)用吧
原文地址:http://www.cnblogs.com/huangxincheng/p/6029214.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的体验Rabbitmq强大的【优先级队列】之轻松面对现实业务场景的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用Middleware给ASP.NET
- 下一篇: RabbitMQ消息队列应用