【发布时间】:2020-03-07 06:47:57
【问题描述】:
我有一个 Rails 应用程序在生产中的 2 台服务器上运行。
我有一个 rake 任务,它运行一些导入,然后向用户发送一封电子邮件。由于有 2 台服务器,我现在收到 2 封电子邮件。
为了避免这种情况,我尝试创建一个表my_import_run。
- 我的导入将检查表中是否存在具有当前日期的记录,只有当不存在时才会运行导入并发送电子邮件。
- 发送电子邮件后,表中的所有记录将被删除,并会添加一条只有当前日期的记录
上面的算法实现如下:
def self.import(search_date = Date.current)
if 0 == MyImportRun.count || !MyImportRun.where(:last_run => Date.today).any?
# the code to run import job and send email goes here
#
#
#
#
MyImportRun.delete_all
MyImportRun.new(:last_run => Date.today)
MyImportRun.save
end
但即使在执行上述代码后,我仍然收到 2 封电子邮件 - 我不知道为什么。我想知道两个导入可能同时运行,因此它们都找不到当前日期的记录并运行导入、发送电子邮件并删除所有记录并添加当前日期的记录。
有没有避免这种情况发生的干净方法?据我了解,rake 任务将自动导入 Linux 中的 cron 作业;所以我不能只从一台服务器上删除 rake 文件。
我确信必须有一个干净的方法来避免这种重复。
【问题讨论】:
-
您使用什么方式在服务器上运行任务?什么时候宝石?
-
没错。我每次使用 gem。
-
如果你愿意改变“cron”平台,你可以使用arask。它只会运行一次任务。
标签: ruby-on-rails rake