Rails 应用部署使用延迟作业服务看似已删除的文件

Rails app deploy using delayed job serving seemingly deleted files

我在带有 nginx、postgres 和 puma 的 ubuntu 服务器上有一个 rails 4.2.3 应用程序 运行,我正在使用 Capistrano 进行部署。

我的应用程序的用户可以使用我提供的几种不同的电子邮件模板并利用 Delayed_Job gem 发送大量电子邮件。最近,我更新了两个电子邮件模板,我发现偶尔(可能 500 次中有 20 次)发送的是旧版本的电子邮件模板,而不是当前版本。我梳理了我的应用程序代码,我很满意旧版本的模板不再存在于应用程序的任何地方。

此外,用户可以通过提供自己的正文来编辑模板,并且在发送旧版本的电子邮件模板时,它会与用户指定的正确正文一起发送。好像我的应用程序 运行 的旧版本在服务器上偶尔会强制发送电子邮件。

当我使用 Capistrano 更新我的部署时,旧的应用程序进程是否仍然存在 运行 并且有时会开始处理 delayed_job 队列? Capistrano 只保留我的应用程序的 5 个最新版本,其中 none 个版本使用的是旧电子邮件模板。因此,如果是这种情况,旧的应用程序进程将需要完全保存在内存中——所以这似乎是不可能的。

任何人有任何想法可以追求吗?我很困惑是什么导致了这个问题(或者这个问题是如何可能的)。非常感谢您的帮助!

(PS:电子邮件使用预邮程序 gem,但我看不出这有什么关系)

这个问题的答案是肯定的,"Is it possible that somehow as I update my deployment using Capistrano, the old application process remains running and sometimes starts working off the delayed_job queue?"

我很惊讶地发现,当您启动一个 delayed job 进程时,它会将完成其任务所需的一切序列化/保存到内存中。 A.K.A 出于实际目的,它保存/创建整个应用程序的新实例。当我将更改推送到我的应用程序时,旧的延迟作业流程没有被正确终止,所以我有大约 20 个延迟的作业流程同时进行。在大多数情况下,最近延迟的作业进程将接管队列。但是,如果它很忙,旧流程会介入并开始使用我的旧版本应用程序处理工作。

为了解决这个问题,我不得不终止旧的延迟作业进程,然后更新我的 Capistrano 代码以确保它不会再次发生。

非常感谢@Dharam 引导我走上正确的道路(post 这个答案花了我一段时间)