【问题标题】:Run a background job every few seconds每隔几秒运行一次后台作业
【发布时间】:2014-04-12 21:25:30
【问题描述】:

假设我有一个应用程序需要从 API 中提取数据,但是我发送查询的频率是有限制的(即上限为 X 请求/分钟)。为了确保我不会达到这个限制,我想将请求添加到队列中,并有一个后台作业将拉 X 个请求并每分钟执行一次。但是,我不确定 Rails 中最好的方法是什么。从我收集到的信息来看,DelayedJob 是满足我需求的更好的库,但我没有看到任何支持每分钟只运行 X 个作业。有谁知道是否有实现此类功能的首选方式?

【问题讨论】:

    标签: ruby-on-rails delayed-job resque


    【解决方案1】:

    我有点晚了,但我想警告您不要在您的情况下使用 whenever gem: 由于您使用的是 Ruby on Rails,因此每次在 cron 中调用时,使用时 gem 都会加载环境。

    试试rufus-scheduler

    下面的代码,例如config/initializers/cron_stuff.rb

    require 'rufus/scheduler'
    
    scheduler = Rufus::Scheduler.start_new
    
    scheduler.every '20m' do
      puts 'hello'
    end
    

    【讨论】:

    • 如果我们需要与数据库交互以存储来自 API 结果的信息,我们每次都会加载环境,对吗?或者whenever 的开销会不会太大?
    • 每当为您创建一个系统“cron”条目时,它每次都会调用类似“rails console”(您知道这有多慢),这每次都会加载环境。最简单的解决方案是在应用程序初始化期间运行上面的 rufus-scheduler 代码,这样可以避免每次都加载环境和数据库连接。当然还有更好的方法,比如创建一个内部有 rufus-scheduler 的 rake 任务(特别是如果你在多个服务器上运行等)。
    【解决方案2】:

    也许你可以尝试[无论何时]:https://github.com/javan/whenever

    然后你可以添加你的任务如下:

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

    在 schedule.rb 文件中

    【讨论】:

    • 每当使用 cron 并且 cron 不能使用少于每 1 分钟
    【解决方案3】:

    首先,我建议使用Sidekiq 来处理后台作业。它得到很好的支持并且使用起来非常简单。如果您确实使用 Sidekiq,那么还有另一个 gem,称为 Sidetiq,可以让您运行重复性作业。

    【讨论】:

      猜你喜欢
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 2012-07-14
      • 2021-11-13
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多