Лучшая архитектура Ruby on Rails для приложения Image Heavy
Я создаю приложение, которое позволяет одновременно загружать большое количество фотографий, и хотел знать, как лучше всего с этим справиться.
Это то, что я использую до сих пор:
- Загрузка файла Jquery: позволяет пользователям перетаскивать изображения
- CarrierWave: обрабатывает изображения и изменяет их размер с помощью ImageMagick
- Amazon S3: CarrierWave загружает изображения в Amazon S3 через Fog
- Heroku: для хостинга
Я бы хотел, чтобы пользователи могли перетаскивать большое количество изображений на страницу, а затем переходить на другие страницы во время загрузки в фоновом режиме. Я также хотел бы, чтобы фотографии появлялись по окончании загрузки. Я не хочу, чтобы этот процесс блокировал династии Героку, поэтому мне, вероятно, нужно перенести работу на фоновую работу, но я не уверен, что использовать в моей ситуации.
Какова наилучшая настройка для этого типа приложения? Какой фоновый рабочий жемчуг я должен использовать? Cloudinary - это хорошая идея?
2 ответа
Недавно я создал приложение, которое принимает большое количество загрузок на Heroku. Я решил создать собственное решение, а не использовать cloudinary или аналогичный. Вот некоторые уроки, которые я выучил:
Не загружайте в Heroku. Весь ваш веб-работник будет заблокирован на все время загрузки. Это до минуты. Неприемлемый.
Используйте загрузчик javascript (например, jquery-file-upload) для прямой загрузки на s3. Сначала это немного сложно, но как только вы это заработаете, это фантастика. Вы можете использовать гем s3_direct_upload или просто прочитать их источник, чтобы создать собственное решение с нуля. Этот камень был основан на эпизоде Railscasts Pro, за который вы должны заплатить, но у него есть доступный источник.
Когда загрузка завершится, отправьте в приложение ajax-запрос, передав новый URL-адрес s3 в качестве удаленного URL-адреса. Carrierwave обработает изображение на s3 так же, как оно было загружено, за исключением нескольких секунд вместо одной минуты.
Используйте изменение размера изображения на стороне клиента в jquery-file-upload. Кто-то попытается загрузить 5-мегабайтную фотографию, а затем суку, которая будет загружаться вечно. Это сделает все загрузки максимально быстрыми теоретически.
Сконфигурируйте s3, чтобы автоматически очистить папку для загрузки.
Не используйте тонкий. Используйте единорога. Пара секунд слишком длинна, чтобы обработать запрос на худощавом, но единорог с тремя или четырьмя работниками гораздо более щадящий.
Не используйте rmagick. Это лучший API для сложных манипуляций с изображениями, но он использует удивительное количество памяти. Вместо этого используйте mini_magick.
Вы заметите, что я не использую фоновый рабочий для всего этого. Если вы действительно чувствуете себя скрупулезно, вы можете попросить контроллер, который получает удаленный URL, передать свою работу фоновому работнику, и, если вам нужен результат, немедленно фоновый работник может уведомить пользовательский интерфейс с помощью pubsub (faye или pusher, возможно, с помощью захватывающий новый драгоценный камень синхронизации). Но это не было необходимым для моего приложения, и я бы лучше потратил свои деньги на другую веб-версию, чем на рабочую версию.
И, да, если вы хотите позволить им щелкать по всему вашему приложению, пока это происходит, вам нужно будет либо загрузить его во всплывающем окне (и использовать какое-нибудь решение pubsub), либо создать весь свой сайт в виде javascript приложение, использующее тлеющий или основной или угловой или любой другой.
Любые вопросы?
Я никогда не видел Cloudinary до твоего упоминания, но, похоже, он отлично подойдет для твоего проекта.
Прежде всего, это потенциально может значительно упростить ваше приложение. Cloudinary поддерживает прямую загрузку из браузера через HTTP-API, и для него уже есть плагин jquery, который основан на загрузке файлов jQuery и имеет аналогичные функции, включая обработку предварительной загрузки на стороне клиента.
Кроме того, он поддерживает преобразования на лету, похожие на стрекозу (также очень хорошая библиотека).
Это означает, что, если вам действительно не нужно загружать эти изображения через ваше приложение, вы можете полностью обойти его, загружая прямо в Cloudify и обрабатывая обрезку изображений и другие преобразования через их API преобразования.
При желании вы можете исключить Carrierwave и S3 из вашего приложения, и, конечно же, не нужно никаких фоновых динамиков для обработки изображений. Кроме того, он, вероятно, будет намного быстрее (прямая загрузка и манипулирование на лету по сравнению с загрузкой в ваше приложение, обработка, затем загрузка в облако) и устранит пропускную способность для загрузки через ваше приложение.
Даже без прямой загрузки кажется, что Cloudinary предоставляет плагин Carrierwave, который все еще может использовать их API преобразования, устраняя необходимость для вашего приложения обрабатывать изображения.