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

问题描述 投票:0回答:2

我有一个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,工作只需几毫秒。如果我打电话给SchedulerJob.perform_later在Sidekiq运行这个工作需要大约90秒才能完成,通过查看日志,我可以看出每个.perform_later呼叫每个大约需要30秒。

为什么会这样?

ruby-on-rails sidekiq rails-activejob
2个回答
0
投票

根据定义,

  1. 排队系统免费后,perform_later将立即执行
  2. 无论您的队列状态如何,都将执行perform

我的猜测是,当你调用perform_later时,队列中会运行一些作业。


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.