0

我有 ActiveRecord 模型:

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

我每天为每个 API 调用User一次。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. 出现错误时重新启动作业(重新排队所有下一个作业?)
4

1 回答 1

0

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

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

为了在特定时间安排工作并重新安排它们,我使用自我永续工作。因此,在工作完成后,它会重新安排自己的时间。就像是

def run_me
  ///code code
   User.delayed_job(:run_at => next_day).run_me
end

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

于 2013-09-24T13:48:09.067 回答