gpt4 book ai didi

ruby-on-rails - 如果我安排一个工作人员每天在 Heroku 上运行,我如何确定它不会运行两次或被跳过?

转载 作者:数据小太阳 更新时间:2023-10-29 08:07:05 25 4
gpt4 key购买 nike

鉴于 Heroku 每天至少重启一次测功机,我对 Clockwork、Sidekiq 和 Redis 如何在 Heroku 上结合在一起感到有点困惑。

假设我有一个每天运行一次的 worker,所以它在 config/clock.rb 中配置为:

module Clockwork
every(1.day, 'Resend confirmation') { ResendConfirmationWorker.perform_async }
end

在这个 worker 中,我获取了所有已创建帐户但在两天内尚未确认的用户,并向他们每个人重新发送一封确认电子邮件。

class ResendConfirmationWorker
include Sidekiq::Worker
sidekiq_options queue: :resend_confirmation, retry: false

def perform
d = Time.zone.now - 2.days
users = User.where.not(confirmation_sent_at: nil)
.where(confirmed_at: nil)
.where(created_at: d.beginning_of_day..d.end_of_day)

users.find_each do |user|
user.send_confirmation_instructions
end
end
end

假设某人在星期一注册,该作业在星期三运行,找到他们并向他们发送第二封确认电子邮件。然后测功机出于某种原因重新启动,作业再次运行。他们会收到另一封电子邮件。或者,如果重启发生在作业需要运行之前的那一刻,那么他们将什么也得不到。

考虑到它在 Heroku dyno 中的“生命周期”,Clockwork 怎么会有超过 24 小时的工作概念?有没有一种方法可以简单地管理这个限制,而不必不断地将这类东西保存到数据库中?

最佳答案

如果你知道你会在每个星期三执行它,我建议使用 Heroku Scheduler ( https://devcenter.heroku.com/articles/scheduler )。它允许您以设定的时间间隔运行特定命令。更少的复杂性。

关于ruby-on-rails - 如果我安排一个工作人员每天在 Heroku 上运行,我如何确定它不会运行两次或被跳过?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41518299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com