Каков наилучший маршрут при загрузке изображений из моего приложения Rails в Amazon S3?

У меня есть веб-приложение, в котором пользователи могут загружать аватар до 700 КБ. Это единственная часть приложения, связанная с загрузкой изображений (поэтому я не буду иметь дело с исключительно большой нагрузкой). Мне было интересно, как лучше всего поступить по этому поводу. В настоящее время я использую Paperclip и не хочу хранить все изображения на Amazon S3.

Вариант 1. Пользователь загружает изображение на мой веб-сервер. Изображение обрабатывается асинхронно с использованием отложенного задания, а затем загружается в s3. Затем изображение удаляется с моего веб-сервера.

Вариант 2. Пользователь загружает изображение непосредственно в s3. Фоновый процесс на моем веб-сервере загружает изображение, обрабатывает его и загружает вновь созданные эскизы в s3.

Вариант 1 в целом использует меньшую полосу пропускания. Вариант 2, похоже, экономит моему приложению ресурсы загрузки изображения непосредственно в него.

Прав ли я в этих предположениях? Какой вариант самый быстрый и самый ресурсоемкий? Или есть другой способ сделать это?

Кроме того, мне было интересно, обрабатывают ли изображения такие сайты, как Twitter, FB и Posterous, асинхронно. Всякий раз, когда я загружаю фотографию профиля в Twitter или изображения на FB и Posterous, они обрабатываются мгновенно.

Спасибо!

Тим


person Tim    schedule 12.10.2010    source источник


Ответы (3)


Если под «обработкой изображения» вы подразумеваете создание эскизов или другие параметры преобразования изображения, вы можете сделать это с помощью скрепки. Если обработка — это огромная задача, которую нельзя выполнить с помощью одной только скрепки, я бы выбрал вариант 1, более дешевый, поскольку вы не получаете доступ к S3 несколько раз. Просто убедитесь, что у вас достаточно места на жестком диске для всех изображений во время обработки.

person Faisal    schedule 12.10.2010

Лучше всего, чтобы пользователь загружал данные непосредственно на S3. Для этого хорошо подходит плагин d2s3.

В обратном вызове d2s3 создайте событие delayed_job для загрузки полноразмерных изображений и сохранения их эскизов на S3 с помощью Хранилище с уменьшенной избыточностью. Если вы все подключите правильно, вы сможете автоматически генерировать миниатюры, если они когда-либо будут потеряны из S3.

person jelder    schedule 20.10.2010

Если вы в конечном итоге пойдете по пути загрузки напрямую на S3, который разгружает работу с вашего сервера Rails, ознакомьтесь с моими примерами проектов:

Пример проекта с использованием Rails 3, Flash и FancyUploader на основе MooTools для прямой загрузки в S3: https://github.com/iwasrobbed/Rails3-S3-Uploader-FancyUploader

Пример проекта с использованием Rails 3, Flash/Silverlight/GoogleGears/BrowserPlus и Plupload на основе jQuery для прямой загрузки в S3: https://github.com/iwasrobbed/Rails3-S3-Uploader-Plupload

Кстати, вы можете выполнить постобработку с помощью Paperclip, используя что-то вроде этого сообщения в блоге:

http://www.railstoolkit.com/posts/fancyupload-amazon-s3-uploader-with-paperclip

person iwasrobbed    schedule 27.05.2011