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