在Rails环境中运行计划任务的最佳方法是什么?脚本/跑步吗?耙?我想每隔几分钟运行一次任务。


当前回答

使用Sidekiq或Resque是一种更加健壮的解决方案。它们都支持重试作业、使用REDIS锁的排他性、监控和调度。

请记住,Resque是一个死项目(没有积极维护),所以Sidekiq是一个更好的选择。它的性能也更高:Sidekiq在单个多线程进程上运行多个worker,而Resque在单独的进程中运行每个worker。

其他回答

我正在使用耙方法(由heroku支持)

使用名为lib/tasks/cron的文件。rake . .

task :cron => :environment do
  puts "Pulling new requests..."
  EdiListener.process_new_messages
  puts "done."
end

要从命令行执行,这就是“rake cron”。然后可以根据需要将此命令放到操作系统cron/任务调度程序上。

更新这是一个相当老的问题和答案!一些新信息:

我引用的heroku cron服务已经被heroku Scheduler所取代 对于频繁的任务(特别是当你想避免Rails环境启动成本时),我的首选方法是使用系统cron来调用一个脚本,该脚本将(a)戳一个安全/私有webhook API来在后台调用所需的任务,或者(b)直接在你选择的排队系统上排队任务

有意思的是没人提到Sidetiq。 如果你已经在使用Sidekiq,这是一个很好的补充。

Sidetiq提供了一个简单的API,用于为 Sidekiq。

Job看起来是这样的:

class MyWorker
  include Sidekiq::Worker
  include Sidetiq::Schedulable

  recurrence { hourly.minute_of_hour(15, 45) }

  def perform
    # do stuff ...
  end
end

你可以使用resque和resque- scheduling gem来创建cron,这很容易做到。

https://github.com/resque/resque

https://github.com/resque/resque-scheduler

我曾经也做过同样的决定,今天我对这个决定很满意。使用resque调度程序,因为不仅一个单独的redis会从你的数据库中取出负载,你还可以访问许多插件,如resque-web,它提供了一个伟大的用户界面。随着系统的发展,你会有越来越多的任务要安排,这样你就可以从一个地方控制它们。

在严重依赖计划任务的项目中,我使用了非常流行的每当,它很棒。它为您提供了一个很好的DSL来定义计划任务,而不必处理crontab格式。自述:

无论何时都是Ruby宝石,提供了一个 用于编写和部署的清晰语法 cron作业。

来自README的例子:

every 3.hours do
  runner "MyModel.some_process"       
  rake "my:rake:task"                 
  command "/usr/bin/my_great_command"
end

every 1.day, :at => '4:30 am' do 
  runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end