Очень медленный вызов execute_later для ActiveJob и Sidekiq - PullRequest
0 голосов
/ 03 мая 2018

У меня есть 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, чтобы запустить задание в Сидекике, это займет около 90 секунд, и, просматривая журналы, я могу сказать, что каждый из этих вызовов .perform_later занимает около 30 секунд каждый.

Почему это случилось?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Проблема была в инициализаторе. Это было решение:

Полагаю, вы уничтожили весь параллелизм, взломав одно глобальное соединение $ REDIS в пуле. Не делай этого. Позвольте Sidekiq создавать и управлять пулом соединений.

0 голосов
/ 03 мая 2018

По определению

  1. perform_later будет выполнено, как только освободится система очередей
  2. perform будет выполняться независимо от вашего состояния очереди

Я предполагаю, что при вызове perform_later в очереди выполняются некоторые задания.

...