Задание Sidekiq в инициализаторе запускается дважды - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть веб-приложение rails, и я интегрирую процесс backgroud с sidekiq. Интеграция Basi c работает нормально.

Дело в том, что мне нужно непрерывно запускать фоновый процесс в al oop. Согласно другому посту я создал al oop, который уволил работника в инициализаторе. Код:

sidekiq.rb

Thread.new do
  loop do    
    puts "Sidekiq.Initializer-->before perform worker"
    MyWorker.perform_async()    
    puts "Sidekiq.Initializer-->after perform worker and before sleep"
    sleep(1.minutes)
    puts "Sidekiq.Initializer-->after sleep"
  end
end

Однако этот инициализатор работает дважды. Первый, когда сервер rails запущен, и второй, когда сервер sidekiq запущен. Как я могу сделать так, чтобы эта функция работала только один раз.

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Более очевидный и идеальный способ - записать значение в базу данных и проверить, существует ли оно в вашем работнике, прежде чем вы его запустите.

Они, вероятно, не будут масштабироваться так, как вам нужно, но, поскольку я не знаю о вашей архитектуре, я дам вам некоторые рекомендации, чтобы вы могли исследовать свой собственный путь:

Внутри config/application.rb:

def ran_special_job?
  @ran_special_job < 5.minutes.ago
end

def ran_special_job_at=(val)
  @ran_special_job = val
end

В вашей работе замкните накоротко:

def perform
  return if Rails.application.ran_special_job?
  Rails.application.ran_special_job_at = Time.now
  puts "I am running"
end

По-другому ваш работник:

def perform
  return if Rails.application.ran_special_job?
  Rails.application.ran_special_job!
  puts "I am running"
end

и в вашем config/application.rb

def ran_special_job?
  return false unless File.exists?("special_job.txt")
  DateTime.parse(File.read("special_job.txt")) < 5.minutes.ago
end

def ran_special_job!
  File.open("special_job.txt", "w") { |file| file.write Time.now }
end

Этот метод не идеален, если вы используете Heroku или какой-либо другой сервис, который не предоставляет постоянную файловую систему, но вы поняли идею.

0 голосов
/ 23 апреля 2020

Звучит так, как будто у вас есть некоторая странность с упорядочением нагрузки, но общий шаблон для этого - заключить его в метод, а затем вызвать этот метод из инициализатора, если вы хотите, чтобы он вызывался при запуске Rails. Я не думаю, что сервер Sidekiq сможет запустить его тогда.

...