Bull queue运行正常后突发停止工作问题排查求助
Bull队列停止工作排查方案
1. 排查停滞/活跃任务积压
- 调用Bull内置API查询当前任务状态:
const jobs = await queue.getJobs(['active', 'stalled']),统计返回结果中active、stalled状态的任务数量 - 查看Redis中
bull:<queue_name>:active对应的value,确认其中存储的活跃任务ID数量是否超过你配置的队列最大并发数。如果超出阈值,说明任务执行过程中卡住,没有调用done()回调、也没有抛出异常,导致任务一直占用消费槽位,新任务无法被消费。
2. 排查锁异常
- 查看Redis中
bull:<queue_name>:lock的TTL值,如果该key无过期时间、永久存在,说明之前的队列消费进程异常退出,没有自动释放全局锁,新启动的消费进程无法拿到锁,无法拉取任务执行。 - 临时验证可直接删除该lock key,观察队列是否恢复消费;后续初始化队列时需配置合理的
lockDuration参数,值设置为队列最长单任务执行时长的1.2~1.5倍即可,示例配置:
const myQueue = new Bull('your_queue_name', { redis: {/*你的redis配置*/}, lockDuration: 30000 // 按实际任务执行时长调整 })
3. 检查配置与进程状态
- 确认近期是否修改过队列的
prefix配置,如果生产者和消费者的prefix不一致,会出现生产者发的任务进了旧前缀队列,消费者读新前缀队列读不到任务的问题。 - 排查消费者进程的运行日志,确认是否存在Redis连接超时、断开的报错,连接异常没有自动重连也会导致队列停止消费。
4. 清理异常残留key
你当前Redis中存在2个重复的bull:<queue_name>:stalled-checkkey,属于异常残留数据,手动删除这两个重复key后重启队列消费进程,Bull会自动生成正常的停滞检测key,恢复停滞任务的自动回收逻辑。
内容的提问来源于stack exchange,提问作者Anchal Nigam
相关产品推荐
相关产品推荐

