【问题标题】:Very slow perform_later call on ActiveJob and Sidekiq对 ActiveJob 和 Sidekiq 的 perform_later 调用非常慢
【发布时间】:2018-05-02 21:39:26
【问题描述】:

我有一个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


    【解决方案1】:

    根据定义,

    1. perform_later将在排队系统空闲时立即执行
    2. 无论您的队列状态如何,都会执行perform

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

    【讨论】:

    • 这只是意味着作业需要更长的时间来执行,但这并不影响入队所需的时间。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-19
      • 2015-05-01
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 2023-04-07
      相关资源
      最近更新 更多