Как я могу отправлять / использовать / изменять данные, которые являются результатом работы фонового работника Sidekiq моего приложения rails? - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть веб-приложение 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. Ну что, есть предложения как это сделать?

Заранее спасибо !!

1 Ответ

0 голосов
/ 28 февраля 2020

Можете ли вы настроить базу данных в своем приложении? А затем храните там записи о выполненных заданиях, также вы можете сохранить весь файл в базе данных, но я рекомендую некоторое облачное хранилище (например, amazon s3). И после этого вы можете отобразить текущее состояние заданий в очереди на некоторой странице для пользователя с помощью кнопки «скачать» после того, как задание выполнено

...