Общие сведения о фоновых рабочих с помощью Redis, Sidekiq, Heroku и Rails 5 - PullRequest
0 голосов
/ 08 января 2019

У меня есть приложение Rails 5, в котором я начинаю перемещать различные задания в фоновый режим, используя Sidekiq, Heroku и Redis.

Пока у меня есть ResetFinanceDataWorker, у которого есть класс с тем же именем.

//reset_finance_data_worker.rb

class ResetFinanceDataWorker
  include Sidekiq::Worker
  sidekiq_options retry: false

  def perform()
  end
end

Я могу позвонить по телефону ResetFinanceDataWorker.perform_in(10.seconds). В идеале мне бы хотелось, чтобы в одном файле было несколько рабочих, например:

//finance_worker.rb

class AnotherWorker
  include Sidekiq::Worker
  sidekiq_options retry: false

  def perform()
  end
end

class ResetFinanceDataWorker
  include Sidekiq::Worker
  sidekiq_options retry: false

  def perform()
  end
end

И возможность вызывать FinanceWorker.AnotherWorker.perform_in (10 секунд). Однако это невозможно.

Может ли кто-нибудь объяснить мне 1) Как бы я заставил эту работу? и 2) Лучшие практики организации рабочих файлов.

Спасибо.

1 Ответ

0 голосов
/ 08 января 2019

Лучшие практики и соглашения заключаются в размещении только одного класса в одном файле с соответствующим именем файла. Не имеет значения, рабочий это или какой-либо другой класс. Если вы хотите упорядочить их, вы можете поместить похожих работников в модуль и переместить их в отдельную папку finance_worker:

 module FinanceWorker  
   class AnotherWorker
   end
 end

В этом случае вы можете позвонить FinanceWorker::AnotherWorker.perform_async

UPDATE:

Создайте отдельную папку finance_worker внутри app/jobs и переместите туда все необходимые рабочие файлы. Оберните все эти рабочие классы в module FinanceWorker. Я имею в виду, обернуть отдельно, все еще в разных файлах, все еще only one class, wrapped in module, inside the file.

Если у вас есть 10 работников, у вас есть 10 файлов для них. Но это работники Сидеки, а не герои, не путайте их. Чтобы запустить Sidekiq, вам нужна только одна строка в Procfile: worker: bundle exec sidekiq. На этой строчке начнется 1 геройка рабочего дина для Сидекика, на котором запустят все его 10 работников. И это нормально, это обычная практика. Если вы заметили, что 1 дина для Sidekiq недостаточно, вы всегда можете добавить больше, они разделят очереди друг на друга.

И не забывайте, что вы можете указать имя очереди для работника. По умолчанию все задания отправляются в общую очередь default. Если вы хотите, чтобы у работника была собственная очередь, просто добавьте к sidekiq_options:

sidekiq_options retry: false, queue: 'finance'
...