如何从 Redis 运行内存不足和由于 Bull 保留已完成作业的密钥而崩溃中恢复?

Tim*_*man 2 out-of-memory redis node.js bull

看来使用Bull 3.21.1作为默认配置的工作队列会导致Redis在成功运行的情况下无限期地保留key,最终耗尽Redis中的内存并导致崩溃。这是一个示例体验,描述如下。我也有同样的经历。这是另一篇文章,其中解释了虽然 Bull 的默认行为不可能在不导致现有用户发生重大更改的情况下实现无内存泄漏,但可以更好地记录默认行为将无限期地保留已完成作业的 Redis 密钥,以及什么该配置是为了在Redis中不泄漏内存的情况下获取操作。 Bull 的文档在撰写此问题时仍然没有提及此行为、配置点或解决方案。

由于 Bull 未记录的默认行为永久保留已完成作业的 Redis 密钥,导致生产(或者更幸运的是预生产)崩溃,我该如何恢复?

Tim*_*man 6

  1. 如果可能的话,增加redis可用的内存,以缓解即时的内存压力。这就是我们所做的。
  2. 删除旧作业密钥的一个潜在的快速手动修复方法是使用以下方法:Bull.Queue#clean(1000 * 60 * 60 * 24)在 package.json 中指定的 NPM 脚本中,并针对您的 prod 节点实例运行。(参数是一个以毫秒为单位的宽限期,不会收获已完成的作业,因此该值将是早于 24 小时的作业。)我们仅在下面执行此操作,以清除所有旧作业,但它本来可以更早使用给气球放气,争取更多的时间。
  3. 通过向 Bull: 提供非默认配置来修复内存泄漏 defaultJobOptions: { removeOnComplete: true, removeOnFail: true }。这将结束 Redis Bull Key 计数和内存消耗的上升,并提供在默认配置和成功运行下没有内存泄漏的最不令人惊讶的行为。