使用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