2017-04-12 27 views
0

Sidekiqを使用して、各タイムゾーンで特定の時刻に実行する戦略は何ですか?Sidekiqはすべてのタイムゾーンで特定の時刻に実行する

例えば、私は世界中で以下の時間と時間帯に毎日のタスクを実行するためにSidekiqが必要:

... 8:00 PM EST 8:00 PM CST 8:00 PM MST 8:00 PM PST ...

+0

その時刻をUTCに変換すると何が問題になりますか? – spickermann

+0

すべての時間をデータベースにUTCで記録します。私の質問は明らかではないかもしれません...世界中のユーザーがおり、各ユーザーのタイムゾーンで午後8時に「毎日のダイジェスト」を送信したいと考えています。それは理にかなっていますか? @spickermann –

+0

[Sidekiq Enterprise](http://sidekiq.org/products/enterprise)でもこれを行うことができますが、無料版とPro版にはこの機能は含まれていません。 – coreyward

答えて

1

私はちょうど毎時の最初に同じ仕事をするでしょう。 1時間ごとにジョブを実行するにはcronを使用するか、recurring jobs in Sidekiqの作成方法についてはこのリストを参照してください。

最初のステップとしてジョブ内では、今すぐ8AMであるすべてのタイムゾーンを把握する必要があります。このような例:このリストでは

8am_time_zones = ActiveSupport::TimeZone.all 
             .select { |tz| tz.now.hour == 8 } 
             .map { |tz| tz.tzinfo.name } 
#=> ["America/Los_Angeles", "America/Tijuana", "America/Phoenix"] 

あなただけで簡単にその時間帯に住んでいるあなたのデータベースからユーザー(あなたはこの形式で、ユーザーのタイムゾーンを保存仮定)をロードし、それらに電子メールを送信することができます

User.where(time_zone: 8am_time_zones).find_each do |user| 
    # email_newsletter(recipient: user) 
end 
0

Sidekiqは「毎日」のご使用の場合にはスケジューリング機構を持っていません。 wheneverのようなcronスケジューラが必要です。

サーバーがUTCに設定されていると仮定すると、あなたは自分のスケジュールを作成したい:

# EST 8pm 
every 1.day, :at => '1:00 am' do 
    runner "MyModel.task_to_run_at_1_am_UTC" 
end 
# CST 8pm 
every 1.day, :at => '2:00 am' do 
    runner "MyOtherModel.task_to_run_at_2_am_UTC" 
end 

1行でそれを行うには:

every '* 6,7,8,9,10 1 * *' do 
    runner "MyOtherModel.task_to_run_at_2_am_UTC" 
end 

cron syntaxが処方されるかを見てみましょう。

+0

私たちのサーバーはUTCに設定されていますが、特定の時刻(例:午後8時)にすべてのタイムゾーンでSAMEの定期タスク(例: 'MyModel.task_1')を実行します。これは 'いつでも'宝石で可能ですか? –

+0

はい、あなたはcron構文を使用します。 – Anthony

+0

私の答えを更新@ChadTaylor – Anthony

関連する問題