gpt4 book ai didi

ruby-on-rails - 在 Heroku 上重启后长时间运行的 delayed_job 作业保持锁定状态

转载 作者:数据小太阳 更新时间:2023-10-29 06:37:09 33 4
gpt4 key购买 nike

当 Heroku worker 重新启动时(根据命令或作为部署的结果),Heroku 将 SIGTERM 发送到 worker 进程。对于 delayed_jobSIGTERM signal is caught然后工作人员在当前作业(如果有)停止后停止执行。

如果工作人员需要很长时间才能完成,那么 Heroku 将发送 SIGKILL。在 delayed_job 的情况下,这会在数据库中留下一个锁定的作业,不会被其他工作人员接收。

我想确保作业最终完成(除非出现错误)。鉴于此,解决这个问题的最佳方法是什么?

我看到两个选项。但我想获得其他输入:

  1. 修改 delayed_job 以在收到 SIGTERM 时停止处理当前作业(并释放锁定)。
  2. 想出一种(编程)方法来检测孤立的锁定作业,然后将其解锁。

有什么想法吗?

最佳答案

在 SIGTERM 上干净地中止作业

delayed_job 现在内置了一个更好的解决方案。通过将此设置添加到您的初始化程序中,使用此设置在 TERM 信号上抛出异常:

Delayed::Worker.raise_signal_exceptions = :term

使用该设置,作业将在 heroku 发出用于非合作进程的最终 KILL 信号之前正确清理并退出:

You may need to raise exceptions on SIGTERM signals, Delayed::Worker.raise_signal_exceptions = :term will cause the worker to raise a SignalException causing the running job to abort and be unlocked, which makes the job available to other workers. The default for this option is false.

raise_signal_exceptions 的可能值为:

  • false - 不会引发异常(默认)
  • :term - 只会在 TERM 信号上引发异常,但 INT 会等待当前作业完成。
  • true - 将在 TERM 和 INT 上引发异常

从版本 3.0.5 开始可用。

参见 this commit它被引入的地方。

关于ruby-on-rails - 在 Heroku 上重启后长时间运行的 delayed_job 作业保持锁定状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10438100/

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