2014-11-10 2 views
3

У меня есть приложение heroku с Rails 4.1.5 на Ruby 2.1.1.Хероку прерывистая ошибка H15 'Idle connection' при загрузке

Приложение включает в себя немного обработки мультимедиа и включает функцию загрузки javascript с использованием Dropzone JS, к действию, которое сохраняет фотографию на Amazon S3 до более поздней обработки в фоновом задании.

У меня возникла очень неприятная проблема. С перерывами - и в зависимости от скорости интернет-соединения - маршрутизатор Heroku убивает действие по загрузке с статусом H15 (бездействующее соединение). Я не верю, что соединение действительно простаивало, поскольку с использованием того же интернет-соединения я могу загружать подобные файлы на другие сайты.

Это не связано с тайм-аутом веб-диноза, поскольку запрос никогда не ударяет по дино в этих случаях, когда маршрутизатор сначала отключает его.

Что может быть здесь?

Примечание: Я реализовал это CORS-обработки техники: http://www.tsheffler.com/blog/?p=428

Журналы:

[Отметка] Heroku [маршрутизатор]: при = код ошибки = H15 убывание = "неактивное соединение" метод = POST path = "/ console/breeds/57-YAMTALE/photos" host = [host] request_id = 634d7680-8b66-4123-a4bc-fe78dc4e7b90 fwd = "[IP]" dyno = web.1 connect = 0ms service = 90232ms status = 503 байт = 0

PROCFILE:

веб: расслоение Exec рельсы сервер тонкие -p \ $ PORT -e \ $ RACK_ENV

самоцветов, которые могут иметь отношение:

жемчужина 'тонкий'

камень 'carrierwave'

камень 'carrierwave_backgrounder'

камень 'RMagick': требуется => 'RMagick'

камень 'АМС-SDK'

Gem 'стойки-CORS',: требуется => 'стойки/Корс'

Gem 'демонами'

камень 'exception_notification'

ответ

0

Вам нужно загружать большие файлы непосредственно на S3 (или эквивалент), а не через приложение Heroku. Вы можете разместить урну в своем приложении (вероятно, используя javascript), а затем обрабатывать с/на S3 в фоновом режиме.

Это, к сожалению, связано.

Heroku имеет (на самом деле очень хорошо) инструкцию здесь на одном конкретном подходе к делать это: https://devcenter.heroku.com/articles/direct-to-s3-image-uploads-in-rails

Деталь

Маршрутизатор Heroku будет тайм-аут, если он не получит первый байт назад в течение 30 секунд.После этого он будет отслеживать 55-секундное окно качения, которое сбрасывается всякий раз, когда байт передается вверх или вниз. https://devcenter.heroku.com/articles/request-timeout

В вашем случае, я предполагаю, что ваша загрузка иногда занимает больше 30 секунд. Хотя вы обрабатываете файл в качестве фоновой задачи, я предполагаю, что вы не отправляете первый байт до тех пор, пока загрузка не будет завершена. Следовательно, прерывистый тайм-аут.

В том же документе Heroku ссылки выше:

Многие веб-приложения позволяют пользователям загружать файлы. Когда эти файлы являются большими, или пользователь находится на медленном интернет-соединении, загрузка может занять более 30 секунд. Для этого мы рекомендуем напрямую загрузить на S3.

блочная загрузка

Я считаю, что существует альтернативный способ решить это с помощью HTTP фрагментированной загрузкой, где ответ первого байта может быть отправлен на ранней стадии. (Это будет работать только на Cedar 1.1 и новее, которое поддерживает 55-секундное окно прокатки).

Фактически, подход с чередованием должен быть проще, чем метод прямого выбора S3 выше. Я никогда не рассматривал это по двум причинам:

1) Heroku не упоминает об этом в качестве опции.

2) Это противоречило бы общему совету Heroku в:

Лучшая практика, чтобы получить время отклика вашего веб-приложения под> 500мс, это позволит высвободить приложение для большего количества запросов и доставить высокое качество обслуживания пользователей.

3) Это может (на основе моего понимания, это было бы) отрицательно повлиять на балансировку нагрузки Heroku, которая является примитивной (или нарушена в зависимости от того, кого вы спросите).

Смежные вопросы