我心中(zhong)的核心組件(jian)~MSMQ與Redis隊列
這個文章其實是我心中的核心組件的第七回,確實在時間上有些滯后了,但內容并不滯后!本文MSMQ只是個引題,我確實不太想說它,它是微軟自己集成的一套消息隊列,寄宿在Window服務里,穩定性十在不敢恭維,而redis隊列我們選擇的驅動客戶端是ServiceStack.Redis,之(zhi)所以選(xuan)擇(ze)它(ta)就是因為它(ta)穩(wen)定,更新快,對于其它(ta)的驅(qu)動可能用上幾(ji)年都不會去更新,而(er)ServiceStack.Redis一直走到(dao)redis客戶(hu)端的前沿!
Redis隊(dui)列實(shi)(shi)時(shi)和(he)非(fei)實(shi)(shi)時(shi):這個說的實(shi)(shi)時(shi)和(he)非(fei)實(shi)(shi)時(shi)主要針對的是(shi)消(xiao)費者這邊,消(xiao)息生產者在(zai)(zai)生產消(xiao)息后,Redis隊(dui)列里存儲了這些消(xiao)息,而何時(shi)消(xiao)費就是(shi)我(wo)們要關心(xin)的問題了,非(fei)實(shi)(shi)時(shi)是(shi)說,在(zai)(zai)后端有(you)(you)個輪訓服務定(ding)時(shi)從(cong)隊(dui)列里拿消(xiao)息,這有(you)(you)一(yi)定(ding)的延(yan)時(shi)性;實(shi)(shi)時(shi)是(shi)說在(zai)(zai)消(xiao)費者一(yi)邊建立(li)Tcp長連(lian)接,當(dang)隊(dui)列有(you)(you)數據后馬上(shang)消(xiao)費它,當(dang)沒有(you)(you)數據時(shi)線程處(chu)于掛起等待狀(zhuang)態(tai)!
大叔實時消息隊列的消費者實現(Redis隊列)
while (true) { var redis = Redis.Client.RedisManager.GetClient();//redis連(lian)接(jie)池 if (redis.GetListCount("queue1") == 0) //消息為空(kong)掛起 { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("隊列(lie)為空,掛(gua)起1秒"); Thread.Sleep(1000); } else { Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("從隊列拿(na)出:" + redis.PopItemFromList("queue1")); } }
大叔非實時消息隊列的實現
非實時隊列主要(yao)是(shi)(shi)在消費(fei)者一方采(cai)用了某種調度機制,定(ding)時去redis隊列里去拿數據,邏輯沒什么復雜的,大叔采(cai)用的調度組件還是(shi)(shi)Quartz.Net,原因(yin)是(shi)(shi)它功能(neng)強大,配置(zhi)靈活,解(jie)耦能(neng)力比(bi)較強!
配合(he)Cron表達式功能更強大(da)