2015-10-23 110 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功能)