2017-04-12 96 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)可以做到這一點,但免費版和專業版不包含此功能。 – coreyward

回答

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沒有調度機制「每天」的你的使用情況。您需要一個cron調度程序,如whenever

假設你的服務器配置爲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 

要做到這一點的一條線:

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

看看cron syntax是如何制定。

+0

我們的服務器設置爲UTC - 但我們希望在特定時間(例如:下午8:00)的每個時區運行同一個循環任務(例如:MyModel.task_1)。這是可能的,每當寶石? –

+0

是的,你只需使用cron語法。 – Anthony

+0

更新了我的答案@ChadTaylor – Anthony

相關問題