如何防止排队的延迟作业中的代码在部署后变得无效?
How do I prevent code in queued delayed jobs becoming invalid after a deploy?
我们在一个相当高流量的 Rails 应用程序中使用 delayed_job,所以队列中总是有作业。
部署后,当您重新启动 dj 时,已经排队的作业中的代码可能会失效。例如,如果部署意味着作业中使用的 class 不再存在,作业将失败。
是否有规避此问题的标准做法?
我会说,你必须:
- 所有工作人员完成工作后立即停止工作
- 部署更改
- 启动工人
我认为 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 在选择合适的实现方面不会有任何问题。
我们在一个相当高流量的 Rails 应用程序中使用 delayed_job,所以队列中总是有作业。
部署后,当您重新启动 dj 时,已经排队的作业中的代码可能会失效。例如,如果部署意味着作业中使用的 class 不再存在,作业将失败。
是否有规避此问题的标准做法?
我会说,你必须:
- 所有工作人员完成工作后立即停止工作
- 部署更改
- 启动工人
我认为 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 在选择合适的实现方面不会有任何问题。