1

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

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

4

1 回答 1

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