Rails Sidekiq延迟任务

时间:2015-10-23 21:17:34

标签: ruby-on-rails heroku sidekiq

我想在sidekiq工作者中进行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工作人员中查看延迟的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

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

Sidekiq是一名背景工作者。如果让一名工人继续工作,它将使队列饱和,而不是为其他工人腾出空间。

您有两种选择:

  • 使用每5分钟执行一次类似cron的进程,例如使用Clockwork
  • 运行Sidekiq任务,每个任务的结束将另一个作业排队等待将来执行5分钟(使用perform_at Sidekiq功能)