Как запросить очереди Sidekiq по классу задания, имени очереди и аргументам?

#ruby-on-rails #sidekiq #rails-activejob

Вопрос:

Я должен проверить, было ли то же самое задание уже добавлено в очередь, прежде чем снова ставить в очередь.

В настоящее время я использую этот код, но он очень неэффективен, потому что загружает все объекты в память. Есть ли способ запросить, как обычную активную запись?

В идеале я бы хотел что-то вроде

 Sidekiq::Queue.where(job_class: "SyncJob", queue_name:"high", arguments: [1,2,3])
 

Текущий код:

 def list_queued_jobs(job_class, queue_name,  arguments)
  found_jobs = []
  queues = Sidekiq::Queue.all
  queues.each do |queue|
    queue.each do |job|
      job.args.each do |arg|
        if arg['job_class'].to_s == job_class.to_s amp;amp; arg['queue_name'] == queue_name amp;amp; ActiveJob::Arguments.deserialize(arg['arguments']) == arguments
          found_jobs << job
        end
      end
    end
  end
  return found_jobs
end
 

Ответ №1:

Готового решения не существует, но есть более простой способ определить, было ли задание уже поставлено в очередь ( true / false ):

 def in_queues?(job_class, queue_name,  arguments = [])
  Sidekiq::Queue.new(queue_name).any? do |job|
    job_class == job.klass amp;amp; job.args == arguments
  end
end
 

Имейте в виду, что аргументы sidekiq представлены в виде массива. Например, если вы называете свою работу так:

 SyncJob.perform_async([1, 2, 3])
 

затем вы проверяете, что он был поставлен в очередь следующим образом:

 in_queues?("SyncJob", "high", [[1, 2, 3]])
 

Комментарии:

1. Спасибо! Это очень быстро! Я только что внес это изменение внутри блока, чтобы заставить его работать задание[‘завернуто’].to_s == job_class.to_s amp;amp; ActiveJob::Аргументы.десериализация(job.args[0][‘аргументы’]) == аргументы

2. @sparkle: да, я допустил опечатку, это должно было быть klass вместо class ), но args , похоже, работает нормально без десериализации на моей локальной машине

3. класс-это «ActiveJob::Адаптеры очереди::SidekiqAdapter::JobWrapper», в то время как задание[‘завернуто’] — это «SyncJob»

4. ах, я вижу, вы используете его вместе с обертками activejob, в то время как я тестировал его с помощью простой настройки Sidekiq) в любом случае, я рад, что это сработало!

Ответ №2:

Проверка наличия существующей работы известна как «уникальные задания». Sidekiq Enterprise предоставляет эту функциональность, как и несколько сторонних драгоценных камней.

Реализация и использование кода, который вы описываете, — очень плохая идея.

Комментарии:

1. Почему это очень плохая идея?

2. См. раздел «Использование и предупреждение». mikeperham.com/2021/04/20/a-tour-of-the-sidekiq-api