2015-10-23 72 views
0

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

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

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

Sidekiq是一名后台工作者。如果让一名工人继续工作,它将使队列饱和并且不会为其他工人腾出空间。

你有两种选择:

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