使用Sidekiq,在每個時區的特定時間執行它的策略是什麼?Sidekiq在每個時區的特定時間執行
例如,我需要Sidekiq每天在下列時間和時區的世界各地執行任務:
... 8:00 PM EST 8:00 PM CST 8:00 PM MST 8:00 PM PST ...
使用Sidekiq,在每個時區的特定時間執行它的策略是什麼?Sidekiq在每個時區的特定時間執行
例如,我需要Sidekiq每天在下列時間和時區的世界各地執行任務:
... 8:00 PM EST 8:00 PM CST 8:00 PM MST 8:00 PM PST ...
我只是運行相同的工作,每小時的開始。您可能希望每小時使用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
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是如何制定。
將該時間轉換爲UTC有什麼問題? – spickermann
我們在數據庫中以UTC記錄所有時間。也許我的問題並不清楚......我們有遍佈全球的用戶,我們希望在每個用戶的時區下午8點發送「每日摘要」。那有意義嗎? @spickermann –
[Sidekiq Enterprise](http://sidekiq.org/products/enterprise)可以做到這一點,但免費版和專業版不包含此功能。 – coreyward