我目前使用redis做消息隊列。因為執(zhí)行一些比較久的任務(wù),所以服務(wù)器重啟什么的,可能會導(dǎo)致隊列消費失敗。比如執(zhí)行的過程如下:1、隊列彈出任務(wù)2、把任務(wù)放到一個zset里面,判斷這個zset,比如超過5分鐘還在,那么就加入隊列,重新消費。3、消費任務(wù) 4、任務(wù)消費完成,這時候從zset里面移除?,F(xiàn)在問題是什么呢?假設(shè)3步驟持續(xù)了10分鐘,但是zset超過5分鐘就認定這個隊列掛掉了。所以又重新放入任務(wù)。如此循環(huán),造成了任務(wù)多次消費。你可能要問,時間設(shè)置久一點不就可以了嗎?時間太久還是太短都不行,時間太久,任務(wù)等待時間太久。而且每個任務(wù)執(zhí)行的時間不確定,有的是1分鐘,有的是30秒,特殊情況15分鐘。忘記說了,分布式環(huán)境,十幾臺幾十臺服務(wù)器。我現(xiàn)在設(shè)想一個方案,現(xiàn)在問題的根源在于,這個任務(wù)到底是不是在運行中。所以我考慮從這里入手。那么如何判斷這個任務(wù)是不是還在運行中?我考慮維護一個tasklist隊列。每隔1秒鐘都提交到redis。同時,定期把5秒鐘沒有匯報的任務(wù)移除掉。任務(wù)恢復(fù)的時候,就判斷這個列表里面是不是存在這個任務(wù)。
如何解決redis隊列消費失敗重復(fù)消費的問題
一只名叫tom的貓
2018-08-18 16:26:40