我只是想了解使用 capistrano 重新启动延迟工作 worker 的最佳实践。我有一群 worker 处理长时间的工作(最多 10 分钟)。
在工作人员正在处理的部署期间,我遇到了两种情况-
1)
我在部署之前停止延迟的工作人员:重启任务并在部署:重启任务后再次启动它们。
但是在这种情况下,在延迟的作业完成之前它不会重新启动我的应用程序(这可能没问题 - 但是 cap 部署脚本实际上就在那里,直到作业完成并且它可以停止所有工作人员),然后再继续重新启动应用程序任务。
2)
我还尝试在重启任务后停止/启动 delayjobs 工作人员 - 但这导致了各种戏剧性的情况,即任务将在没有等待的情况下停止,delayedjobs 表将它们列出并分配给一个 PID 不存在的工作人员!
还有其他选择吗?或者我是否被迫像场景 1 中提到的那样等待。
非常感谢。
编辑:我刚刚意识到场景 1 .. 它不会等待!即使停止任务还没有完成,它也会强行杀死我的 worker !
** [out] delayed_job: trying to stop process with pid 9630...
** [out] delayed_job: process with pid 9630 won't stop, we forcefully kill it...
** [out]
** [out] delayed_job: process with pid 9630 successfully stopped.
最佳答案
如果您的部署更改更改了数据库架构,那么您将不得不等待。
如果没有,您可以设置一个标志,让 worker 在每项工作结束时检查。部署时,您设置标志,一旦长时间运行的工作人员完成,它会通过执行新工作人员来替换自己。这样你就永远不会真正启动和停止工作人员——他们只是一直在运行,并且会在开始下一项工作时加载最新的代码。
关于ruby-on-rails - 延迟作业重启 + Capistrano 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9697273/