在ActiveJob和Sidekiq上调用非常慢的perform_later

时间:2018-05-02 21:39:27

标签: ruby-on-rails sidekiq rails-activejob

我有SchedulerJob

class SchedulerJob < ActiveJob::Base
  queue_as :scheduler

  def perform
    logger.debug("Start")
    DelayedJob.set(wait: 10.seconds).perform_later
    logger.debug("After Job 1")
    DelayedJob.set(wait: 20.seconds).perform_later
    logger.debug("After Job 2")
    DelayedJob.set(wait: 30.seconds).perform_later
    logger.debug("End")
  end
end

DelayedJob

class DelayedJob < ActiveJob::Base
  queue_as :delayed_jobs

  def perform
    puts "I'm done"
  end
end

如果我呼叫SchedulerJob.new.perform,作业将在几毫秒内完成。如果我在Sidekiq中调用SchedulerJob.perform_later来运行该作业,则需要大约90秒才能完成,通过查看日志,我可以看出每个.perform_later调用每个都需要大约30秒。

为什么会发生这种情况?

2 个答案:

答案 0 :(得分:0)

根据定义,

    排队系统空闲后,
  1. perform_later将立即执行
  2. 无论您的队列状态如何,都将执行
  3. perform
  4. 我的猜测是,当你拨打perform_later时,队列中正在运行一些作业。

答案 1 :(得分:0)

问题在于初始化程序。 This was the solution:

  

我的猜测是你通过将一个全局$ REDIS连接入侵池中来破坏所有并发性。不要那样做。让Sidekiq创建和管理连接池。