Зависими задачи в 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

Функцията Batch на Sidekiq Pro се справя лесно с това.

person Mike Perham    schedule 19.04.2014