私は、Herokuが少なくとも1日に1回はdynosを再起動することを前提に、Clockwork、Sidekiq、およびRedisがどのように一緒になっているかについて少し混乱しています。Herokuで毎日実行するように作業者をスケジュールすると、それが2回実行されない、またはスキップされることをどのように確認できますか?
が、それは次のようにconfig/clock.rb
で構成されていますので、私は一日一回実行される労働者を持って言う:
module Clockwork
every(1.day, 'Resend confirmation') { ResendConfirmationWorker.perform_async }
end
、私はアカウントを作成しているが、中にそれを確認していないすべてのユーザーを取得2日間、それぞれに確認メールを再送信します。
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
のは、誰かが月曜日にサインアップするとしましょう、この仕事は、水曜日に実行される、それらを見つけ、それらを第二確認メールを送信します。その後、何らかの理由でdynoが再起動し、ジョブが再び実行されます。彼らはまだ別の電子メールを得るでしょう。あるいは、ジョブが実行される前に再起動が発生した場合、何も取得されません。
HerokuDynoの「寿命」を考えれば、Clockworkは24時間以上のジョブの概念をどのように持っていますか?このようなことをデータベースに絶えず保存しなくても、この制限を単純に管理する方法はありますか?
これは可能な限り最良の回答です。 – rdegges