gpt4 book ai didi

heroku - 从 Heroku 上的 Resque::TermException 或 SIGTERM 干净地恢复

转载 作者:行者123 更新时间:2023-12-04 02:19:12 24 4
gpt4 key购买 nike

当我们重新启动或部署时,我们会在失败的队列中使用 Resque::TermException (SIGTERM) 获得许多 Resque 作业。或 Resque::DirtyExit .

我们正在使用新的 TERM_CHILD=1 RESQUE_TERM_TIMEOUT=10在我们的 Procfile 中,我们的工作线程如下所示:

worker:  TERM_CHILD=1 RESQUE_TERM_TIMEOUT=10 bundle exec rake environment resque:work QUEUE=critical,high,low

我们也在使用 resque-retry我认为这可能会自动重试这两个异常?但似乎不是。

所以我想有两个问题:
  • 我们可以从 Resque::TermException 手动救援在每个作业中,并使用它来重新安排作业。但是有没有一种干净的方法可以为所有工作做到这一点?甚至是猴子补丁。
  • 不应该 resque-retry 自动重试这些吗?你能想出任何理由为什么它不会吗?

  • 谢谢!

    编辑:在 10 秒内完成所有作业在规模上似乎不合理。当 Resque::DirtyExit 异常运行时,似乎需要一种方法来自动重新排队这些作业。

    最佳答案

    我也遇到了这个问题。结果是 Heroku 发送了 SIGTERM不仅向父进程发出信号,还向所有 fork 进程发出信号。这不是 Resque 期望的导致 RESQUE_PRE_SHUTDOWN_TIMEOUT 的逻辑被跳过,强制执行作业而没有任何时间尝试完成作业。

    Heroku 在 SIGTERM 后让 worker 有 30 秒的时间正常关闭发出。在大多数情况下,如果作业无法完成,这是足够的时间来完成作业,并留出一些缓冲时间以将作业重新排队到 Resque。但是,要使用所有这些时间,您需要设置 RESQUE_PRE_SHUTDOWN_TIMEOUTRESQUE_TERM_TIMEOUT环境变量以及补丁 Resque 以正确响应 SIGTERM被发送到 fork 进程。

    这是一个 gem,它修补了 resque 并更详细地解释了这个问题:

    https://github.com/iloveitaly/resque-heroku-signals

    关于heroku - 从 Heroku 上的 Resque::TermException 或 SIGTERM 干净地恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15074551/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com