1

我计划从 Heroku Scheduler 转移到使用 Clockwork gem 的自定义时钟进程。如果任务在下一个相同类型的调度任务之前没有完成,Heroku 调度程序将终止该任务。我如何在 Sidekiq 中实现这一目标?

鉴于 Timeout 不是线程安全的。在 Sidekiq 工作人员中执行此操作是个坏主意吗?

class RunsTooLongWorker
  include Sidekiq::Worker

  sidekiq_options :retry => false

  def perform(*args)
    Timeout::timeout(2.hours) do
      # do possibly long running task
    end
  end
end

如果不是还有什么选择?假设我想每 10 分钟运行一次作业,但我不想同时运行相同的作业。我应该如何处理?

4

2 回答 2

0

要回答您问题的这一部分:

鉴于 Timeout 不是线程安全的。在 Sidekiq 工作人员中执行此操作是个坏主意吗?

这是 Mike Perham 写的一篇很棒的博客文章,介绍了 为什么不应该在 sidekiq 作业中使用 Ruby 的超时模块

至于另一种选择……听起来您最需要的是确保您的工作不会相互绊倒。为此,我可以想到两种方法:

  • 穷人的方法:在您正在处理的对象的模型上创建一个“入队”属性。当您开始正在进行的任何处理时,将该项目标记为已入队,完成后将其标记为“未入队”。将你每十分钟的工作范围限定给那些没有排队的人。或者,使用您的作业名称及其状态字段创建一个新表,并在重新执行处理之前查询它的可用性。

  • 如果您有更复杂的事情要做,这听起来像是Sidekiq Unique Jobs gem 的一个很好的案例。. 我认为“执行时”方法是您想要的方法。

于 2015-11-13T22:02:22.660 回答
-3

我想您的任务的解决方案将是使用wheneverSidekiq wiki建议的gem ,这是安装后的wikiwhenever它将创建config/schedule.rb文件,您可以在其中定义工作计划,例如

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

正如您从代码片段中看到的那样,它具有三种内置类型,runner, rake and command但您也可以定义自己拥有的类型,并且在 wiki 中也对其进行了解释。

于 2015-08-06T15:18:50.957 回答