如何防止排队的延迟作业中的代码在部署后变得无效?

How do I prevent code in queued delayed jobs becoming invalid after a deploy?

我们在一个相当高流量的 Rails 应用程序中使用 delayed_job,所以队列中总是有作业。

部署后,当您重新启动 dj 时,已经排队的作业中的代码可能会失效。例如,如果部署意味着作业中使用的 class 不再存在,作业将失败。

是否有规避此问题的标准做法?

我会说,你必须:

  1. 所有工作人员完成工作后立即停止工作
  2. 部署更改
  3. 启动工人

我认为 this code 可能对您有所帮助。

Is there a standard practice for getting round this?

是的,多阶段部署(或任何合适的名称)。

步骤 1:部署新版本的代码,同时允许新旧作业 运行。例如,如果您要删除一些 class,让新作业不要使用它,但不要删除 class,以便旧作业可以使用它。

第 2 步:等待所有旧作业处理完毕。

步骤 3:部署删除 class 和旧作业版本的更改。

注意:您可以通过复制旧作业代码并为其提供新的 "version" 来实施步骤 1。例如,如果您有 ProjectJobs::Import,则将其复制为 ProjectJobs::Import2(此版本不会使用您要删除的 class)。由于它们 class 不同,DJ 在选择合适的实现方面不会有任何问题。