У меня есть приложение Ruby на Rails 6, которое должно генерировать отчет, когда пользователь отправляет форму, создание которой может занять до 5 минут. Я использую Sidekiq, чтобы обработать генерацию отчета и отправить его пользователю по электронной почте после завершения.
Проблема, с которой я сталкиваюсь, заключается в том, что Heroku имеет фиксированный 30-секундный перезапуск процесса, поэтому работник не ' не может завершить отчет до завершения процесса. В документации Sidekiq предлагаемое решение - вставить Sidekiq::ProcessSet.new.each(&:quiet!)
в хук перед развертыванием. Однако я не могу найти какую-либо документацию о том, как создать такой хук.
Поэтому у меня есть два вопроса:
Это лучший способ подойти к длинной работающий процесс, подобный этому, и:
Если так, как я могу создать и выполнить ловушку перед развертыванием
Я звоню работнику в контроллере вот так:
Reporters::FinanceReportWorker.perform_async('report_method', email, start_date, end_date)
Это рабочий класс:
module Reporters
class FinanceReportWorker
include Sidekiq::Worker
def perform(report_name, email, start_date, end_date)
report = Reporters::FinanceReport.send(report_name, start_date, end_date)
file_name = "#{report_name}_report_#{start_date}-#{end_date}.csv"
csv = report
.map {|r|
r.to_csv
}
.join "\n"
ReportMailer.report_email(email, csv, file_name).deliver_now
end
end
end
Любая помощь будет принята с благодарностью!