redis實(shí)現(xiàn)延時(shí)隊(duì)列

在工作中想實(shí)現(xiàn)一個(gè)延遲功能,一般會(huì)借助rocketmq或者kafka的延遲隊(duì)列功能來實(shí)現(xiàn),但是這倆個(gè)消息中間件都有一個(gè)弊端,就是很難支持任意時(shí)間段的延遲,所以我想借助redis實(shí)現(xiàn)一個(gè)任意時(shí)間段的延遲功能

總體架構(gòu)圖


上述圖主要分為5個(gè)模塊

1 路由模塊,為了支持分布式部署,每接收一個(gè)延遲消息,都為這個(gè)消息生成一個(gè)全局唯一的消息ID,根據(jù)消息ID和路由算法,決定把延遲消息的消息ID加入到對(duì)應(yīng)的redis.sortSet隊(duì)列中

2 消息存儲(chǔ),所有的消息元數(shù)據(jù)存儲(chǔ)采用redis.hashmap結(jié)構(gòu),key為生成的全局消息ID(可以加一個(gè)前綴),value為消息的JSON格式,例如{"ttl":600,"topic":"XXX".......}

3 延遲隊(duì)列,所有的消息的延遲存儲(chǔ)在redis.sortSet中,sortSet中的每一個(gè)對(duì)象為全局生成的消息ID,score為到期時(shí)間時(shí)間戳

4 定時(shí)掃描timer,輪訓(xùn)redis.sortSet隊(duì)列,使用ZRANGEBYSCORE命令,獲取score小于等于當(dāng)前時(shí)間的所有消息ID,然后根據(jù)消息ID查詢r(jià)edis.hashmap中的消息元數(shù)據(jù),然后根據(jù)業(yè)務(wù)發(fā)送到對(duì)應(yīng)的topic下

5 消息中間件,借助消息中間件,訂閱者直接消費(fèi)消息,達(dá)到延遲的功能

總結(jié)

上述只是整體的羅列了一下借助redis怎么實(shí)現(xiàn)任意時(shí)間段延遲的功能,一些細(xì)節(jié)沒有詳細(xì)說明,如果想實(shí)現(xiàn)一個(gè)比較完美的延遲功能,需要考慮以下幾點(diǎn)

a 消息的發(fā)送失敗如果處理

b redis操作沒有事物保證

c 怎么保證hashmap和sortSet中的數(shù)據(jù)一致性

d 如果消息量大了怎么進(jìn)行動(dòng)態(tài)的擴(kuò)展

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容