Rails activerecord作业队列具有最大执行频率

时间:2013-09-24 13:26:09

标签: ruby-on-rails job-scheduling

我有ActiveRecord模型:

User(id,user_specific_attributes, last_check:datetime, check_priority:integer, today_api_calls:integer)

我每天都会为每个User做一次API调用。 API有一些重要的限制:

  • 从上午4点到晚上8点可以访问
  • 通话频率限制:每分钟10次=超时6秒
  • 通话数限制:3000 /天

我需要每天get_some_data_from_api()User运行一次(凌晨4点开始)。执行顺序由check_priority列定义。 如果get_some_data_from_api()出错,则应在6秒后重新启动作业(api限制)。

有没有适合这种情况的宝石?

像Sidekiq,Delayed Job,Resque这样的宝石是不合适的。使用它们我需要在特定时间排队所有作业。考虑一下:

  1. 添加具有高优先级的新作业(重新排列所有下一个作业?)
  2. 作业执行时间可能超过6秒
  3. 发生错误时重新启动作业(重新排队所有下一个作业?)

1 个答案:

答案 0 :(得分:0)

Delayed job也可以。它具有在特定时间运行的选项,并在作业失败时重新安排。

DJ作为您应用的单独实例运行。您可以为作业分配优先级。执行时间无关紧要。它内置了用于配置失败重试的选项。

要在特定时间安排工作并重新安排工作,我会使用自我延续的工作。所以在工作完成后,它会重新安排自己。像

这样的东西
def run_me
  ///code code
   User.delayed_job(:run_at => next_day).run_me
end

您可以用同样的方式处理某些错误。例如,如果超过api限制,您可能希望捕获一些异常并在第二天重新安排,而不是6秒。