2017-04-12 94 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

相关问题