成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于Redis實(shí)現(xiàn)的延遲隊(duì)列

aisuhua / 2840人閱讀

摘要:基于實(shí)現(xiàn)的延遲隊(duì)列參考有贊延遲隊(duì)列設(shè)計(jì)實(shí)現(xiàn)項(xiàng)目地址應(yīng)用場(chǎng)景訂單超過(guò)分鐘未支付,自動(dòng)關(guān)閉訂單完成后如果用戶一直未評(píng)價(jià)天后自動(dòng)好評(píng)會(huì)員到期前天到期前天分別發(fā)送短信提醒猜想支付寶異步通知時(shí)間間隔是如何實(shí)現(xiàn)的通知的間隔頻率一般是訂單支付成功后生成

delay-queue

基于Redis實(shí)現(xiàn)的延遲隊(duì)列, 參考有贊延遲隊(duì)列設(shè)計(jì)實(shí)現(xiàn)

項(xiàng)目地址

應(yīng)用場(chǎng)景

訂單超過(guò)30分鐘未支付,自動(dòng)關(guān)閉

訂單完成后, 如果用戶一直未評(píng)價(jià), 5天后自動(dòng)好評(píng)

會(huì)員到期前15天, 到期前3天分別發(fā)送短信提醒

猜想

支付寶異步通知時(shí)間間隔是如何實(shí)現(xiàn)的(通知的間隔頻率一般是:2m,10m,10m,1h,2h,6h,15h)

訂單支付成功后, 生成通知任務(wù), 放入消息隊(duì)列中.
任務(wù)內(nèi)容包含Array{0,0,2m,10m,10m,1h,2h,6h,15h}和通知到第幾次N(這里N=1, 即第1次).
消費(fèi)者從隊(duì)列中取出任務(wù), 根據(jù)N取得對(duì)應(yīng)的時(shí)間間隔為0, 立即發(fā)送通知.

第1次通知失敗, N += 1 => 2
從Array中取得間隔時(shí)間為2m, 添加一個(gè)延遲時(shí)間為2m的任務(wù)到延遲隊(duì)列, 任務(wù)內(nèi)容仍包含Array和N

第2次通知失敗, N += 1 => 3, 取出對(duì)應(yīng)的間隔時(shí)間10m, 添加一個(gè)任務(wù)到延遲隊(duì)列, 同上
......
第7次通知失敗, N += 1 => 8, 取出對(duì)應(yīng)的間隔時(shí)間15h, 添加一個(gè)任務(wù)到延遲隊(duì)列, 同上
第8次通知失敗, N += 1 => 9, 取不到間隔時(shí)間, 結(jié)束通知

實(shí)現(xiàn)原理

利用Redis的有序集合,member為JobId, score為任務(wù)執(zhí)行的時(shí)間戳,

每秒掃描一次集合,取出執(zhí)行時(shí)間小于等于當(dāng)前時(shí)間的任務(wù).

依賴

Redis

運(yùn)行

./delay-queue -c delay-queue.conf

HTTP Server監(jiān)聽0.0.0.0:9277, Redis連接地址127.0.0.1:6379, 數(shù)據(jù)庫(kù)編號(hào)1

HTTP接口

請(qǐng)求方法 POST

請(qǐng)求Body及返回值均為json

返回值
{
  "code": 0,
  "message": "添加成功",
  "data": null
}
參數(shù)名 類型 含義 備注
code int 狀態(tài)碼 0: 成功 非0: 失敗
message string 狀態(tài)描述信息
data object, null 附加信息
添加任務(wù)

URL地址 /push

{
  "topic": "order",
  "id": "15702398321",
  "delay": 3600,
  "ttr": 120,
  "body": "{"uid": 10829378,"created": 1498657365 }"
}
參數(shù)名 類型 含義 備注
topic string Job類型
id string Job唯一標(biāo)識(shí) 需確保JobID唯一
delay int Job需要延遲的時(shí)間, 單位:秒
ttr int Job執(zhí)行超時(shí)時(shí)間, 單位:秒
body string Job的內(nèi)容,供消費(fèi)者做具體的業(yè)務(wù)處理,如果是json格式需轉(zhuǎn)義
輪詢隊(duì)列獲取任務(wù)

服務(wù)端會(huì)Hold住連接, 直到隊(duì)列中有任務(wù)或180秒后超時(shí)返回,
任務(wù)執(zhí)行完成后需調(diào)用finish接口刪除任務(wù), 否則任務(wù)會(huì)重復(fù)投遞, 消費(fèi)端需能處理同一任務(wù)的多次投遞

URL地址 /pop

{
  "topic": "order"
}
參數(shù)名 類型 含義 備注
topic string Job類型

隊(duì)列中有任務(wù)返回值

{
  "code": 0,
  "message": "操作成功",
  "data": {
    "id": "15702398321",
    "body": "{"uid": 10829378,"created": 1498657365 }"
  }
}

隊(duì)列為空返回值

{
  "code": 0,
  "message": "操作成功",
  "data": null
}
刪除任務(wù)

URL地址 /delete

{
  "id": "15702398321"
}
參數(shù)名 類型 含義 備注
id string Job唯一標(biāo)識(shí)
完成任務(wù)

URL地址 /finish

{
  "id": "15702398321"
}
參數(shù)名 類型 含義 備注
id string Job唯一標(biāo)識(shí)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/23164.html

相關(guān)文章

  • Delayer 基于 Redis 延遲消息隊(duì)列中間件

    摘要:基于的延遲消息隊(duì)列中間件,采用開發(fā),支持等多種語(yǔ)言客戶端。參考有贊延遲隊(duì)列設(shè)計(jì)中的部分設(shè)計(jì),優(yōu)化后實(shí)現(xiàn)。會(huì)員到期前天,短信通知續(xù)費(fèi)。其他針對(duì)某個(gè)任務(wù),延遲執(zhí)行功能的需求。服務(wù)器端定時(shí)使用連接池并行將中到期的放入對(duì)應(yīng)的中,供客戶端取出。 Delayer 基于 Redis 的延遲消息隊(duì)列中間件,采用 Golang 開發(fā),支持 PHP、Golang 等多種語(yǔ)言客戶端。 參考 有贊延遲隊(duì)列設(shè)計(jì)...

    Xufc 評(píng)論0 收藏0
  • laravel 隊(duì)列

    摘要:如果任務(wù)沒(méi)有在規(guī)定時(shí)間內(nèi)完成,那么該有序集合的任務(wù)將會(huì)被重新放入隊(duì)列中。這兩個(gè)進(jìn)程操縱了三個(gè)隊(duì)列,其中一個(gè),負(fù)責(zé)即時(shí)任務(wù),兩個(gè),負(fù)責(zé)延時(shí)任務(wù)與待處理任務(wù)。如果任務(wù)執(zhí)行成功,就會(huì)刪除中的任務(wù),否則會(huì)被重新放入隊(duì)列中。 在實(shí)際的項(xiàng)目開發(fā)中,我們經(jīng)常會(huì)遇到需要輕量級(jí)隊(duì)列的情形,例如發(fā)短信、發(fā)郵件等,這些任務(wù)不足以使用 kafka、RabbitMQ 等重量級(jí)的消息隊(duì)列,但是又的確需要異步、重試...

    BDEEFE 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<