Зависимые задания в Sidekiq — Как избежать запуска до завершения?

У меня есть следующая структура работы в моем приложении Rails:

def perform(page_ids, email, order_id)
    job_ids = []
    page_ids.each do |id|
      job_ids << ShoeBuilder.perform_async(id, order_id)
    end
    CheckStatus.perform_async(job_ids, email) unless job_ids.empty?
end

В основном я запускаю N ShoeBuilders, и у меня есть рабочий CheckStatus, который продолжает проверять, все ли эти задания завершены, чтобы отправить электронное письмо пользователю. Вот как выглядит CheckStatus:

 def perform(ids, email, order_id)
    finished = []
    while finished.size < ids.size 
      ids.each do |id|
        status = Sidekiq::Status::status(id)
        # We consider finished if it has been completed or failed
        if (( Sidekiq::Status::complete?(id) || Sidekiq::Status::failed?(id) ) && !finished.include?(id))
          finished << id
        end
      end
      sleep 5 
    end
    Notifier.thanks(email, order_id).deliver
  end

Итак, моя проблема заключается в следующем:

ShoeBuilder выполняет некоторую работу, но в какой-то момент, если он не смог найти свою информацию (это рабочий синтаксический анализатор), запустит другой экземпляр ShoeBuilder. И вот моя проблема:

  • Когда я запускаю задание ShoeBuilder из другого задания ShoeBuilder, первое завершается. Как я могу этого избежать?
  • Если я не могу избежать этого, как я могу сообщить CheckStatus, чтобы он учитывал этот новый идентификатор задания вместо исходного?

person StarTrek18    schedule 06.04.2014    source источник


Ответы (2)


Если вы не можете использовать Sidekiq Pro, Sidekiq Superworker также поддерживает это:

# config/initializers/superworkers.rb
Superworker.create(:MySuperworker, :page_ids, :email, :order_id) do
  batch page_ids: :page_id do
    ShoeBuilder :page_id, :order_id
  end
  Notifier :email, :order_id
end

# Anywhere
MySuperworker.perform_async([1, 2, 3], '[email protected]', 378)

Когда вы запускаете MySuperworker, он ставит в очередь задания ShoeBuilder для всех идентификаторов страниц. Когда все это будет завершено, запустится Notifier. (Отказ от ответственности: я автор драгоценного камня.)

person Tom    schedule 18.09.2014

Функция пакетной обработки Sidekiq Pro легко справляется с этой задачей.

person Mike Perham    schedule 19.04.2014