Подтвердить что ты не робот

Лучшая архитектура Ruby on Rails для Image Heavy App

Я создаю приложение, которое позволяет одновременно загружать большие объемы фотографий, и хотел бы знать, для чего лучше всего будет справляться.

Это то, что я использую до сих пор:

  • Загрузка файла JQuery: позволяет пользователям перетаскивать изображения
  • CarrierWave: обрабатывает изображения и изменяет их размеры с помощью ImageMagick
  • Amazon S3: CarrierWave загружает изображения в Amazon S3 через Fog.
  • Heroku: для хостинга

Я бы хотел, чтобы пользователи могли перетаскивать большое количество изображений на страницу, а затем переходить на другие страницы, когда загрузка происходит в фоновом режиме. Я также хотел бы, чтобы изображения отображались, когда они заканчивали загрузку. Я не хочу, чтобы этот процесс блокировал динамики Heroku, поэтому мне, вероятно, нужно переместить работу в фоновое задание, но я не уверен, что использовать для моей ситуации.

Какая самая лучшая настройка для этого типа приложений? Какую фонограмму работника я должен использовать? Является ли Cloudinary хорошей идеей?

4b9b3361

Ответ 1

Недавно я создал приложение, которое принимает большое количество загрузок на Heroku. Я решил создать собственное решение вместо использования облачного или эквивалентного. Вот некоторые уроки, которые я узнал:

  • Не загружайте в герою. Весь веб-рабочий будет заблокирован на весь период загрузки. Это до минуты. Неприемлемо.

  • Используйте загрузчик javascript (например, jquery-file-upload) для загрузки непосредственно на s3. Сначала это немного сложно, но как только вы получите его работу, это фантастика. Вы можете использовать s3_direct_upload gem, или вы можете просто прочитать их источник, чтобы сделать свое собственное решение с нуля. Этот камень был основан на railscasts pro эпизоде, за который вы должны заплатить, но доступен.

  • Когда загрузка завершается, сделайте запрос ajax для вашего приложения, передав новый URL s3 как удаленный URL. Затем Carrierwave обрабатывает изображение на s3, как оно было загружено, за исключением всего лишь нескольких секунд, а не до минуты.

  • Используйте jquery-file-upload изменение размера клиентской части. Кто-то собирается загрузить фото 5 МБ, а затем сука, что загрузка занимает навсегда. Это сделает все загрузки настолько быстрыми, насколько это возможно теоретически.

  • Настройте s3 на автоматически очистите папку для загрузки.

  • Не используйте тонкие. Используйте unicorn. Пара секунд слишком длинная, чтобы обрабатывать запрос на тонкие, но единорог с тремя или четырьмя рабочими гораздо более прощает.

  • Не используйте rmagick. Это лучший API для сложных манипуляций с изображениями, но использует огромное количество памяти. Вместо этого используйте mini_magick.

Вы заметите, что я не использую фоновый рабочий для любого из этого. Если вы действительно чувствуете себя дотошно, вы можете заставить диспетчера, который получает удаленный URL-адрес, передать свою работу второму работнику, и если вам нужно немедленно, фоновый работник мог бы уведомить пользовательский интерфейс pubsub (faye или push файл, возможно, с помощью захватывающий новый sync gem). Но это не было необходимо для моего приложения, и я предпочел бы тратить деньги на другой веб-динамод, чем на рабочий дино.

И да, если вы хотите позволить им щелкнуть по всему вашему приложению, пока это происходит, вам нужно будет либо загружать всплывающее окно (и использовать какое-то решение pubsub), либо создавать весь сайт как приложение javascript, использующее ember или позвоночник или angular или что-то еще.

Есть вопросы?

Ответ 2

Я никогда не видел Cloudinary перед вашим упоминанием, но похоже, что это будет отлично подходит для вашего проекта.

Прежде всего, это потенциально может значительно упростить ваше приложение. CloudMan поддерживает прямую загрузку из браузера через свой HTTP API, и там уже есть jquery plugin, который основанный на загрузке файла jQuery и имеет аналогичные функции, включая обработку предварительной загрузки на стороне клиента.

Кроме того, он поддерживает преобразования "на лету", похожие на dragonfly (также очень хорошая библиотека).

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

Вы могли бы устранить Carrierwave и S3 из своего приложения, если это было необходимо, и, конечно, не было бы необходимости в каких-либо фоновых динамиках для обработки изображений. Кроме того, это, скорее всего, будет намного быстрее (прямая загрузка и "на лету" манипуляции, а также загрузка в приложение, обработка, а затем загрузка в облако) и устраняет пропускную способность для загрузки через ваше приложение.

Даже без прямой загрузки кажется, что Cloudinary предоставляет плагин Carrierwave, который все еще может использовать свой API преобразования, устраняя необходимость в вашем приложении для обработки изображений.