溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#中怎么利用RabbitMQ實(shí)現(xiàn)一個(gè)延遲隊(duì)列功能

發(fā)布時(shí)間:2021-07-07 15:43:24 來(lái)源:億速云 閱讀:388 作者:Leah 欄目:編程語(yǔ)言

本篇文章給大家分享的是有關(guān)C#中怎么利用RabbitMQ實(shí)現(xiàn)一個(gè)延遲隊(duì)列功能,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

一、 需求背景

當(dāng)用戶在商城上進(jìn)行下單支付,我們假設(shè)如果8小時(shí)沒(méi)有進(jìn)行支付,那么就后臺(tái)自動(dòng)對(duì)該筆交易的狀態(tài)修改為訂單關(guān)閉取消,同時(shí)給用戶發(fā)送一份郵件提醒。那么我們應(yīng)用程序如何實(shí)現(xiàn)這樣的需求場(chǎng)景呢?在之前的《C# Redis緩存過(guò)期實(shí)現(xiàn)延遲通知實(shí)戰(zhàn)演練》分享課程中阿笨最后總結(jié)的時(shí)候說(shuō)過(guò)Redis Pub/Sub是一種并不可靠地消息機(jī)制,他不會(huì)做信息的存儲(chǔ),只是在線轉(zhuǎn)發(fā),那么肯定也沒(méi)有ack確認(rèn)機(jī)制,另外只有訂閱段監(jiān)聽時(shí)才會(huì)轉(zhuǎn)發(fā)!我們是否有更好的方式去實(shí)現(xiàn)呢?今天給大家分享的比較好的解決方案就是通過(guò)RabbitMQ的TTL(time to live )和DLX(Dead-Letter-Exchange)來(lái)實(shí)現(xiàn)延遲任務(wù)。

1.1、本次分享課程適合人群如下:

1、有一定的NET開發(fā)基礎(chǔ)并對(duì)RabbitMQ技術(shù)有一定了解和認(rèn)識(shí)。

2、喜歡阿笨的干貨分享課程的童鞋們。

1.2、一句話總結(jié)今天我們要學(xué)習(xí)的目標(biāo)和成果?

C#如何通過(guò)RabbitMQ如何實(shí)現(xiàn)延遲隊(duì)列功能。

如果您對(duì)本次《C#RabbitMQ延遲隊(duì)列功能實(shí)戰(zhàn)項(xiàng)目演練》分享課程感興趣的話,那么請(qǐng)跟著阿笨一起學(xué)習(xí)吧。

廢話不多說(shuō),直接上干貨,我們不生產(chǎn)干貨,我們只是干貨的搬運(yùn)工。

二、場(chǎng)景介紹

2.1、什么是延遲隊(duì)列?

延遲隊(duì)列存儲(chǔ)的對(duì)象肯定是對(duì)應(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)用場(chǎng)景如下:

場(chǎng)景一:物聯(lián)網(wǎng)系統(tǒng)經(jīng)常會(huì)遇到向終端下發(fā)命令,如果命令一段時(shí)間沒(méi)有應(yīng)答,就需要設(shè)置成超時(shí)。

場(chǎng)景二:訂單下單之后30分鐘后,如果用戶沒(méi)有付錢,則系統(tǒng)自動(dòng)取消訂單。

阿笨個(gè)人理解延遲隊(duì)列主要兩類應(yīng)用場(chǎng)景:“被動(dòng)延遲”業(yè)務(wù)場(chǎng)景和“主動(dòng)延遲”業(yè)務(wù)場(chǎng)景。

三、思路講解

3.1、實(shí)現(xiàn)思路

 生產(chǎn)者輸出消息到Queue1,并且這個(gè)消息是設(shè)置有有效時(shí)間的,比如60s。消息會(huì)在Queue1中等待60s,如果沒(méi)有消費(fèi)者收掉的話,它就是被轉(zhuǎn)發(fā)到Queue2,Queue2有消費(fèi)者,收到,處理延遲任務(wù)。

C#中怎么利用RabbitMQ實(shí)現(xiàn)一個(gè)延遲隊(duì)列功能

RabbitMQ延時(shí)隊(duì)列實(shí)現(xiàn)原理圖

3.2、實(shí)現(xiàn)方案

方案一:在rabbitmq 3.5.7及以上的版本提供了一個(gè)插件(rabbitmq-delayed-message-exchange)來(lái)實(shí)現(xiàn)延遲隊(duì)列功能。同時(shí)插件依賴Erlang/OPT 18.0及以上。

方案二:通過(guò)RabbitMQ的Time To Live(TTL)和Dead Letter Exchanges(DLX)兩個(gè)特性來(lái)曲線實(shí)現(xiàn)延遲隊(duì)列。

實(shí)現(xiàn)方案分為兩種,這里阿笨推薦方案二!

四、實(shí)現(xiàn)步驟

1)、基于隊(duì)列方式實(shí)現(xiàn)延遲隊(duì)列(消息隊(duì)列中所有消息的過(guò)期TTL一樣)

通過(guò)隊(duì)列屬性設(shè)置,隊(duì)列中所有消息都有相同的過(guò)期時(shí)間。

2)、基于消息方式實(shí)現(xiàn)延遲隊(duì)列(消息隊(duì)列中單個(gè)消息的過(guò)期TTL不一樣)

對(duì)消息進(jìn)行單獨(dú)設(shè)置,每條消息TTL可以不同。

五、課后思考與總結(jié)

5.1、思考與總結(jié)

需求:用戶在系統(tǒng)中創(chuàng)建一個(gè)訂單,如果10s后,用戶沒(méi)有進(jìn)行支付,那么自動(dòng)取消訂單。

分析:

        1、上面這個(gè)情況,我們就適合使用延時(shí)隊(duì)列來(lái)實(shí)現(xiàn),那么延時(shí)隊(duì)列如何創(chuàng)建

        2、延時(shí)隊(duì)列可以由 過(guò)期消息+死信隊(duì)列 來(lái)時(shí)間

        3、過(guò)期消息通過(guò)隊(duì)列中設(shè)置 x-message-ttl 參數(shù)實(shí)現(xiàn)

        4、死信隊(duì)列通過(guò)在隊(duì)列申明時(shí),給隊(duì)列設(shè)置 x-dead-letter-exchange 參數(shù),然后另外申明一個(gè)隊(duì)列綁定x-dead-letter-exchange對(duì)應(yīng)的交換器。

以上就是C#中怎么利用RabbitMQ實(shí)現(xiàn)一個(gè)延遲隊(duì)列功能,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI