Как отложить задания sidekiq на 10 минут и подсчитать их в конце?

#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
 

Это приблизительная презентация. но вы могли бы сделать что-то подобное, чтобы достичь того, чего вы хотите.