我需要尽可能多地在我的 Rails 5 应用程序中运行 ActiveJob。
到目前为止,我使用的是使用 whenever gem 定义的 cron 作业(过去使用 Crono(。
这种方法在执行其操作之前启动整个rails应用程序,然后关闭并重新执行。我希望避免它,而是有一个持久的"服务"来完成这项工作。
我碰到了Rufus Scheduler宝石,它看起来不错,但后来我开始想知道我是否需要它。
所以,我的问题是:
以下这两个选项之间是否有任何有意义的区别:
# With Rufus
scheduler = Rufus::Scheduler.new
scheduler.every('1s') { puts 'hello' }
scheduler.join
# Without Rufus
loop { puts "hello" ; sleep 1 }
请注意,这些脚本中的任何一个都将使用rails runner my_scheduler.rb
作为 docker 容器执行,并且任何解决方案都必须确保作业仅运行一次(从不并行运行两个(。
有差异。
Rufus调度器every
将尝试每1秒运行一次,因此在t0 + 1,t0 + 2,t0 + 3等。虽然"睡眠"变体将以 t0、t0 + wt1 + 1、t0 + wt1 + 1 + wt2 + 1 运行,...(其中 wtN = 第 N 次调用puts hello
的工作时间(。
Rufus-schedulerevery
将使用 rufus-scheduler 工作线程,因此如果存在重叠(wt(Nb(> wt(Na((,Nb 无论如何都会发生。可以更改此行为(请参阅作业选项(。
Rufus调度程序interval
更接近您的睡眠选项:
scheduler.interval('1s') { puts 'hello' }
它在每次运行puts 'hello'
之间放置 1 秒(或您想要的任何时间间隔(。
对于一个简单的睡眠循环,我会选择睡眠选项。但是如果你需要更多,rufus-scheduler有cron
,interval
,every
和调优选项。您可以安排多个作业。
scheduler.cron('0 1 1 * *') do
# every first of the month at 1am
flush_archive
end
scheduler.cron('0 8,13,19 * * mon-fri') do
# every weekday at 8am, 1pm, 7pm
clean_dishes
end
scheduler.interval('1s') do
puts 'hello'
end