如何从Bull已完成任务留存Key导致Redis内存耗尽崩溃的问题中恢复
Bull队列默认配置导致Redis内存耗尽的恢复方案
紧急恢复步骤
如果当前Redis已经因为内存耗尽不可用,优先按以下步骤恢复业务:
- 优先临时扩容Redis实例内存,快速解除OOM限制,保证核心业务可用
- 确认无需留存历史已完成/失败的任务数据后,可批量清理Bull生成的无效历史任务Key,匹配规则为
bull:{队列名称}:{completed/failed}:*,批量清理命令参考:# 清理所有已完成的Bull任务Key,执行前请先测试匹配规则避免误删 redis-cli --scan --pattern "bull:*:completed:*" | xargs redis-cli DEL # 如需清理失败任务,修改pattern为bull:*:failed:*即可 - 业务允许的前提下,暂时暂停非核心Bull队列的消费与任务提交,降低新Key生成速率,为后续配置调整预留时间
长期规避方案
Bull默认会永久留存所有已完成、已失败的任务Key,需要主动配置任务留存策略避免内存泄漏重复发生:
- 队列初始化时配置全局默认任务规则,示例如下:
const Queue = require('bull'); const workQueue = new Queue('业务队列名称', { redis: { host: 'Redis地址', port: 6379, password: 'Redis密码(如有)' }, defaultJobOptions: { // 已完成任务保留1小时,单位为毫秒,可根据业务需求调整 removeOnComplete: 3600 * 1000, // 失败任务保留7天,单位为毫秒,可根据业务需求调整,设置为true则任务完成/失败后直接删除 removeOnFail: 7 * 24 * 3600 * 1000 } }); - 如需为单任务单独配置留存规则,可在调用
add方法提交任务时传入removeOnComplete和removeOnFail参数,优先级高于队列全局配置 - 新增Redis巡检规则,定期统计Bull相关Key的内存占用和数量增长趋势,提前发现异常
注意:上述配置修改仅对新提交的任务生效,历史已生成的无效任务Key需要手动清理或自行配置定时脚本定期清理。
内容的提问来源于stack exchange,提问作者Tim Heilman
相关产品推荐
相关产品推荐

