Rails Sidekiq延迟任务

Rails Sidekiq delay task

我想在一个 sidekiq worker 中做一个 for 循环,每个循环之间有 5 分钟的延迟。但是当我尝试将它部署到 Heroku 时,我的应用程序崩溃了

class DelayedCallWorker
    include Sidekiq::Worker
    include Sidekiq::Status::Worker

    def perform(survey_id)
        @twilio_sid = ENV['TWILIO_ACCOUNT_SID']
        @twilio_token = ENV['TWILIO_AUTH_TOKEN']
        @twilio_number = ENV['TWILIO_NUMBER']

        @survey = Survey.find(survey_id)
        phone_number = @survey.call_center_number

        @client = Twilio::REST::Client.new @twilio_sid, @twilio_token

        @leads = @survey.leads.where(call_needed: true)
        @leads.each do |lead|
            @call = @client.account.calls.create(
              :from => @twilio_number,
              :to => lead.phone, 
              :url => "http://example.com/connect?number=#{phone_number}"
              )
            sleep, 180
        end
    end
end

如果我注释掉 sleep, 180 一切正常,但不会有延迟。

我还尝试了一种变体,我循环遍历控制器中的引线,并使用 perform_in(5.minutes, survey_id) 创建每个工人延迟更长的工人,但这同样使 heroku 崩溃。

有谁知道在 sidekiq worker 中进行延迟的最佳方法是什么?

这绝对不是您想在 Sidekiq 中执行的那种任务。或者至少,不像你那样设计。

Sidekiq 是一名后台工作者。如果您保留一名工作人员 运行,它会使队列饱和并且不会为其他工作人员释放 space。

您有两个选择:

  • 使用每 5 分钟执行一次的类似 cron 的进程,例如使用 Clockwork
  • 运行 一个 Sidekiq 任务,每个任务队列的末尾将在未来 5 分钟内执行另一个作业(使用 perform_at Sidekiq 功能)