如何解决redis队列消费失败重复消费的问题

我目前使用redis做消息队列。因为执行一些比较久的任务,所以服务器重启什么的,可能会导致队列消费失败。
比如执行的过程如下:

1、队列弹出任务
2、把任务放到一个zset里面,判断这个zset,比如超过5分钟还在,那么就加入队列,重新消费。
3、消费任务 
4、任务消费完成,这时候从zset里面移除。

现在问题是什么呢?假设3步骤持续了10分钟,但是zset超过5分钟就认定这个队列挂掉了。所以又重新放入任务。
如此循环,造成了任务多次消费。
你可能要问,时间设置久一点不就可以了吗?时间太久还是太短都不行,时间太久,任务等待时间太久。
而且每个任务执行的时间不确定,有的是1分钟,有的是30秒,特殊情况15分钟。
忘记说了,分布式环境,十几台几十台服务器。


我现在设想一个方案,现在问题的根源在于,这个任务到底是不是在运行中。所以我考虑从这里入手。
那么如何判断这个任务是不是还在运行中?我考虑维护一个tasklist队列。每隔1秒钟都提交到redis。同时,定期把5秒钟没有汇报的任务移除掉。
任务恢复的时候,就判断这个列表里面是不是存在这个任务。


一只名叫tom的猫
浏览 2960回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript