【问题标题】:Rails Sidekiq delay taskRails Sidekiq 延迟任务
【发布时间】:2015-10-23 21:17:34
【问题描述】:

我想做一个 for 循环,在 sidekiq 工作人员中每个循环之间有 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 工作人员内部查看延迟的最佳方法是什么?

【问题讨论】:

    标签: ruby-on-rails heroku sidekiq


    【解决方案1】:

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

    Sidekiq 是后台工作人员。如果您让一个工作人员继续运行,它将使队列饱和,并且不会为其他工作人员释放空间。

    你有两种选择:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-21
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      相关资源
      最近更新 更多