新聞中心
本篇文章給大家分享的是有關(guān)C#中怎么利用RabbitMQ實(shí)現(xiàn)一個(gè)延遲隊(duì)列功能,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
成都創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)昆玉,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792
一、 需求背景
當(dāng)用戶在商城上進(jìn)行下單支付,我們假設(shè)如果8小時(shí)沒有進(jìn)行支付,那么就后臺自動(dòng)對該筆交易的狀態(tài)修改為訂單關(guān)閉取消,同時(shí)給用戶發(fā)送一份郵件提醒。那么我們應(yīng)用程序如何實(shí)現(xiàn)這樣的需求場景呢?在之前的《C# redis緩存過期實(shí)現(xiàn)延遲通知實(shí)戰(zhàn)演練》分享課程中阿笨最后總結(jié)的時(shí)候說過Redis Pub/Sub是一種并不可靠地消息機(jī)制,他不會(huì)做信息的存儲(chǔ),只是在線轉(zhuǎn)發(fā),那么肯定也沒有ack確認(rèn)機(jī)制,另外只有訂閱段監(jiān)聽時(shí)才會(huì)轉(zhuǎn)發(fā)!我們是否有更好的方式去實(shí)現(xiàn)呢?今天給大家分享的比較好的解決方案就是通過RabbitMQ的TTL(time to live )和DLX(Dead-Letter-Exchange)來實(shí)現(xiàn)延遲任務(wù)。
1.1、本次分享課程適合人群如下:
1、有一定的NET開發(fā)基礎(chǔ)并對RabbitMQ技術(shù)有一定了解和認(rèn)識。
2、喜歡阿笨的干貨分享課程的童鞋們。
1.2、一句話總結(jié)今天我們要學(xué)習(xí)的目標(biāo)和成果?
C#如何通過RabbitMQ如何實(shí)現(xiàn)延遲隊(duì)列功能。
如果您對本次《C#RabbitMQ延遲隊(duì)列功能實(shí)戰(zhàn)項(xiàng)目演練》分享課程感興趣的話,那么請跟著阿笨一起學(xué)習(xí)吧。
廢話不多說,直接上干貨,我們不生產(chǎn)干貨,我們只是干貨的搬運(yùn)工。
二、場景介紹
2.1、什么是延遲隊(duì)列?
延遲隊(duì)列存儲(chǔ)的對象肯定是對應(yīng)的延時(shí)消息,所謂”延時(shí)消息”是指當(dāng)消息被發(fā)送以后,并不想讓消費(fèi)者立即拿到消息,而是等待指定時(shí)間后,消費(fèi)者才拿到這個(gè)消息進(jìn)行消費(fèi)。
2.2、使用RabbitMQ實(shí)現(xiàn)延遲任務(wù)應(yīng)用場景如下:
場景一:物聯(lián)網(wǎng)系統(tǒng)經(jīng)常會(huì)遇到向終端下發(fā)命令,如果命令一段時(shí)間沒有應(yīng)答,就需要設(shè)置成超時(shí)。
場景二:訂單下單之后30分鐘后,如果用戶沒有付錢,則系統(tǒng)自動(dòng)取消訂單。
阿笨個(gè)人理解延遲隊(duì)列主要兩類應(yīng)用場景:“被動(dòng)延遲”業(yè)務(wù)場景和“主動(dòng)延遲”業(yè)務(wù)場景。
三、思路講解
3.1、實(shí)現(xiàn)思路
生產(chǎn)者輸出消息到Queue1,并且這個(gè)消息是設(shè)置有有效時(shí)間的,比如60s。消息會(huì)在Queue1中等待60s,如果沒有消費(fèi)者收掉的話,它就是被轉(zhuǎn)發(fā)到Queue2,Queue2有消費(fèi)者,收到,處理延遲任務(wù)。
RabbitMQ延時(shí)隊(duì)列實(shí)現(xiàn)原理圖
3.2、實(shí)現(xiàn)方案
方案一:在rabbitmq 3.5.7及以上的版本提供了一個(gè)插件(rabbitmq-delayed-message-exchange)來實(shí)現(xiàn)延遲隊(duì)列功能。同時(shí)插件依賴Erlang/OPT 18.0及以上。
方案二:通過RabbitMQ的Time To Live(TTL)和Dead Letter Exchanges(DLX)兩個(gè)特性來曲線實(shí)現(xiàn)延遲隊(duì)列。
實(shí)現(xiàn)方案分為兩種,這里阿笨推薦方案二!
四、實(shí)現(xiàn)步驟
1)、基于隊(duì)列方式實(shí)現(xiàn)延遲隊(duì)列(消息隊(duì)列中所有消息的過期TTL一樣)
通過隊(duì)列屬性設(shè)置,隊(duì)列中所有消息都有相同的過期時(shí)間。
2)、基于消息方式實(shí)現(xiàn)延遲隊(duì)列(消息隊(duì)列中單個(gè)消息的過期TTL不一樣)
對消息進(jìn)行單獨(dú)設(shè)置,每條消息TTL可以不同。
五、課后思考與總結(jié)
5.1、思考與總結(jié)
需求:用戶在系統(tǒng)中創(chuàng)建一個(gè)訂單,如果10s后,用戶沒有進(jìn)行支付,那么自動(dòng)取消訂單。
分析:
1、上面這個(gè)情況,我們就適合使用延時(shí)隊(duì)列來實(shí)現(xiàn),那么延時(shí)隊(duì)列如何創(chuàng)建
2、延時(shí)隊(duì)列可以由 過期消息+死信隊(duì)列 來時(shí)間
3、過期消息通過隊(duì)列中設(shè)置 x-message-ttl 參數(shù)實(shí)現(xiàn)
4、死信隊(duì)列通過在隊(duì)列申明時(shí),給隊(duì)列設(shè)置 x-dead-letter-exchange 參數(shù),然后另外申明一個(gè)隊(duì)列綁定x-dead-letter-exchange對應(yīng)的交換器。
以上就是C#中怎么利用RabbitMQ實(shí)現(xiàn)一個(gè)延遲隊(duì)列功能,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
新聞標(biāo)題:C#中怎么利用RabbitMQ實(shí)現(xiàn)一個(gè)延遲隊(duì)列功能
網(wǎng)頁路徑:http://fisionsoft.com.cn/article/pjecpi.html