#ruby-on-rails #ruby #jobs #sidekiq #job-scheduling
Вопрос:
В настоящее время я выполняю определенную работу sidekiq каждый раз, когда меняется атрибут модели.
Пример: Я изменяю и сохраняю каждый из следующих attrs: заголовок, описание и текст. Таким образом, теперь будут выполнены 3 задания sidekiq.
title was changed
description was changed
text was changed
Как я могу настроить sidekiq на ожидание 10 минут после первого изменения атрибута, а затем выполнить определенную работу, если jobs.count > 1
?
Пример: Я снова изменяю и сохраняю каждый из следующих attrs: заголовок, описание и текст снова. И теперь в течение 10 минут он должен выполнить только 1 задание sidekiq с сообщением типа.
3 attributes were updated
Ответ №1:
Это звучит так, как будто тебе нужно какое-то оправдание. Вот отзыв sidekiq, который соответствует вашим критериям.
Я никогда не пробовал, но readme этого драгоценного gem 'sidekiq-debouncer'
камня вполне описывает такие же потоки.
https://github.com/paladinsoftware/sidekiq-debouncer Установите этот драгоценный камень.
настройте свой параметр для задания, которое вы хотите отменить, например, для первичного ключа класса.
Так что вам нужно что-то вроде этого.
class MyWorker
include Sidekiq::Worker
include Sidekiq::Debouncer
sidekiq_options(
debounce: {
time: 10 * 60
},
by: -> (job_args) {
job_args[0] # this is the ID you pass in the argument in `perform` method.
}
)
def perform(id, attributes)
# perform your action on that record.
# and if you are using the class variable like I've explained below, just reset that.
end
end
Так что это действительно так.
Вы можете использовать что-то вроде переменной класса, как я упоминал в методе выполнения, в качестве комментария, в котором содержится информация о тех атрибутах, которые были обновлены, но для которых не было выполнено задание sidekiq.
class Something
@@unperformed_updated_attributes = {}
def setup
@@unperformed_updated_attributes[id].merge!(updated_attribute: new_value)
end
def reset
@@unperformed_updated_attributes[id] = {}
end
end
Это приблизительная презентация. но вы могли бы сделать что-то подобное, чтобы достичь того, чего вы хотите.