2012-09-19 4 views
1

Я читал много областей в Интернете, которые говорят о загрузке файлов в Rails, заставляют веб-приложение зависать, и мне было интересно, так ли это в случае с Heroku Dyno? Если пользователь должен был загрузить файл с 1 гигабайтом, то это приведет к зависанию остальной части приложения, если оно будет размещено на одном дикторе?Загрузка файлов Heroku и Rails

ответ

2

По умолчанию Rails не является потокобезопасным. Это означает, что каждый экземпляр Rails может обрабатывать только один запрос за раз.

На Heroku вы можете запустить 1 процесс на одном динамо. Это может быть Thin, Unicorn, работник delayed_job и т. Д.

Поскольку Rails по умолчанию не является потокобезопасным, Thin может обрабатывать только один запрос за раз (что означает, что ваш dyno может обрабатывать только один запрос за раз). В этом случае, когда пользователь загружает 1 ГБ файл, Thin может обрабатывать только этот запрос = вызывает зависание следующих запросов. Чтобы решить эту проблему, вам придется масштабировать количество динамиков. Например, вы используете 4 динамика (работает Thin), и вы можете обрабатывать 4 запроса одновременно.

Однако, если вы используете Единорог на вашем динаре Heroku и установите количество рабочих Unicorn равным 4, Rails может обрабатывать 4 запроса за раз. Единорог умный. Он порождает 4 процесса внутри этого сингла Heroku. Это означает, что когда вы загружаете файл размером 1 ГБ, Unicorn продолжает и обрабатывает 3 запроса в то время. И все это работает на одном дино.

Проверьте эту статью для получения дополнительной информации о Heroku и Единороге: http://michaelvanrooijen.com/articles/2011/06/01-more-concurrency-on-a-single-heroku-dyno-with-the-new-celadon-cedar-stack/

Надеется, что это помогает.

UPDATE

Если вы загружаете файлы на S3, вы можете пропустить ваши динамометрические стенды полностью и загружать файлы непосредственно на S3. Просто подсказка. ;-)

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