Один образец я часто используется с рабочими Sidekiq является определение perform_all
метод:«Не называй .delay по классу Sidekiq :: Worker, называют .perform_async»
class ModelMutateWorker
include Sidekiq::Worker
def perform(id)
model = Model.find(id)
# Mutate model in some way
end
def self.perform_all
batch = Sidekiq::Batch.new
batch.description = "#{self.name}.#{__method__}"
batch.jobs do
Sidekiq::Client.push_bulk('class' => self, 'args' => Model.ids.map { |id| [id] })
end
return batch
end
end
В этом несколько надуманный пример , звонки Model.ids
и Sidekiq::Client.push_bulk
являются несколько дорогими. При выполнении этого действия из веб-запроса или командной строки предпочтительно также откладывать их.
ModelMutateWorker.delay(queue: "my_other_queue").perform_all
Однако Sidekiq 4.0 removed.delay
, .delay_for
и .delay_until
от Sidekiq::Worker
. Я не помню, чтобы когда-либо видел предупреждение об этом. Есть ли СУХОЙ способ вернуть это поведение?
Чтобы уточнить, вы имеете в виду нового работника «BulkOperation» для каждого прежнего метода 'perform_all'? – jelder
Простой класс, который поддерживает этот метод. Модель может восприниматься как аргумент. –