Как настроить хук перед развертыванием для Sidekiq на Heroku - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть приложение Ruby на Rails 6, которое должно генерировать отчет, когда пользователь отправляет форму, создание которой может занять до 5 минут. Я использую Sidekiq, чтобы обработать генерацию отчета и отправить его пользователю по электронной почте после завершения.

Проблема, с которой я сталкиваюсь, заключается в том, что Heroku имеет фиксированный 30-секундный перезапуск процесса, поэтому работник не ' не может завершить отчет до завершения процесса. В документации Sidekiq предлагаемое решение - вставить Sidekiq::ProcessSet.new.each(&:quiet!) в хук перед развертыванием. Однако я не могу найти какую-либо документацию о том, как создать такой хук.

Поэтому у меня есть два вопроса:

  1. Это лучший способ подойти к длинной работающий процесс, подобный этому, и:

  2. Если так, как я могу создать и выполнить ловушку перед развертыванием

Я звоню работнику в контроллере вот так:

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

Любая помощь будет принята с благодарностью!

...