Я новичок в разработке масштабируемых RoR-приложений, поэтому я надеюсь на предложения о том, как перенастроить/заново настроить следующее. У меня есть приложение RoR, размещенное на Heroku, которое получает входящие письма через Mailgun на контроллер, который затем анализирует электронную почту и загружает их для хранения.RoR: Масштабирование входящей электронной почты с Heroku/Mailgun
Я получаю ошибки таймаута H12-запроса в моих журналах Heroku при попытке обработать электронные письма с несколькими/большими вложениями. Тайм-аут возвращается в Mailgun, который затем пытается повторить запрос с предопределенными интервалами, между тем Heroku продолжает обрабатывать запрос ... поэтому он попадает в цикл, и я завершаю загрузку нескольких файлов в хранилище.
Внутри Heroku У меня есть 1 веб-и 1 рабочая динамо, работаю Puma как мой веб-сервер.
Вот мой puma.rb файл:
preload_app!
min_threads = Integer(ENV['MIN_THREADS'] || 0)
max_threads = Integer(ENV['MAX_THREADS'] || 5)
threads min_threads, max_threads
workers Integer(ENV['WORKER_COUNT'] || 3)
on_worker_boot do
ActiveSupport.on_load(:active_record) do
if Rails.application.config.database_configuration
config = Rails.application.config.database_configuration[Rails.env]
config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
config['pool'] = ENV['DB_POOL'] || 5
ActiveRecord::Base.establish_connection(config)
end
# ActiveRecord::Base.establish_connection
end
end
Я неясно, как лучше воспользоваться рабочими динамометрических стендах в этой ситуации, и как доложить Mailgun, что все хорошо, так что не пытается выполнить один и тот же запрос.
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
Спасибо за ваше время и помощь.
EDIT Некоторая дополнительная информация:
Мой контроллер делает все обработки. Я запрашиваю базу данных для соответствия входящей электронной почты пользователю. Кроме того, я запрашиваю/отправляю данные стороннему API ... это для получения допустимого токена аутентификации и загрузки данных.
Что вы на самом деле делаете в запросе? Вы утверждаете, что они разбираются и выгружают их? Это действительно происходит, пока запрос открыт? С подобными транзакциями вам необходимо выполнить абсолютный минимум, а затем выполнить тяжелую работу в фоновом работнике, чтобы он вышел из цикла запроса. –
Да, я верю. Рекомендации для/как создать фонового работника? Благодарю. – user464180