У меня есть веб-приложение ruby на рельсах, развернутое на Heroku.
Это веб-приложение извлекает некоторые каналы заданных URL-адресов в виде XML-файлов. Затем регулирует эти XML-файлы и создает один файл XML. Некоторое время это работало довольно хорошо. Однако, поскольку количество URL-адресов и объявлений о работе увеличивается, оно не работает вообще. Этот процесс иногда занимает до 45 секунд, поскольку имеется более 35 тыс. Вакансий (Heroku отправляет тайм-аут через 30 секунд). У меня ошибка H12 . Эта ошибка привела меня к прочтению рабочих дин и фоновой обработки .
Я понял, что должен применить следующий подход:
Масштабируемый подход Heroku
Теперь я использую Redis и Sidekiq в своем проекте. И я могу создать фонового работника для всей грязной работы. Но вот мой вопрос.
Вместо того, чтобы делать этот вызов в классе контроллера:
def apply
send_data Aggregator.new(providers: providers).call,
type: 'text/xml; charset=UTF-8;',
disposition: 'attachment; filename=indeed_apply_yes.xml'
end
Я делаю этот execute_asyn c вызов.
def apply
ReportWorker.perform_async(Time.now)
redirect_to health_path #and returns status 200 ok
end
Я реализовал этот класс: ReportWorker вызывает службу агрегирования . data_ xml - это поле, которое мне нужно где-то показать или загрузить автоматически, когда оно будет готово.
class ReportWorker
include Sidekiq::Worker
sidekiq_options retry: false
data_xml = nil
def perform(start_date)
url_one = 'https://www.examplea.com/abc/download-xml'
url_two = 'https://www.exampleb.com/efg/download-xml'
cursor = 'stop'
providers = [url_one, url_two, cursor]
puts "SIDEKIQ WORKER GENERATING THE XML-DATA AT #{start_date}"
data_xml = Aggregator.new(providers: providers).call
puts "SIDEKIQ WORKER GENERATED THE XML-DATA AT #{Time.now}"
end
end
Я знаю, что не рекомендуется делать методы send_data / file доступными из классов Controller. Ну что, есть предложения как это сделать?
Заранее спасибо !!