Каков наилучший подход для обработки больших загрузок файлов в приложении rails?

Мне интересно понять различные подходы к обработке больших загрузок файлов в приложении Rails, 2-5Gb файлах.

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

  • Конфигурация на стороне сервера потребуется для приема больших запросов POST и, возможно, 64-битной машины для обработки чего-либо более 4Gb.
  • AWS поддерживает многостраничную загрузку.
  • HTML5 FileSystemAPI имеет постоянный загрузчик, который загружает файл в куски.
  • Библиотека для Bitorrent, хотя для этого нужен клиент передачи, который не идеален

Можно ли возобновить все эти методы, как FTP, причина, по которой я не хочу использовать FTP, - это то, что я хочу сохранить в веб-приложении, если это возможно? Я использовал carrierwave и paperclip, но я ищу что-то, что можно будет возобновить, поскольку загрузка файла 5Gb может занять некоторое время!

Из этих подходов, которые я перечислил, я хотел бы выполнить то, что сработало хорошо, и если есть другие подходы, которые могут отсутствовать? Никаких плагинов, если это возможно, скорее не будет использовать Java-апплеты или Flash. Еще одна проблема заключается в том, что эти решения хранят файл в памяти при загрузке, что также является ограничением, которое я предпочел бы избежать, если это возможно.

5 ответов

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

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

Верьте или нет, мне действительно повезло, просто используя mod_porter. Mod_porter заставляет apache выполнять кучу работы, которую обычно выполняет ваше приложение. Это помогает не связывать поток и кучу памяти во время загрузки. Это приводит к локальному файлу вашего приложения, что упрощает его обработку. Если вы обратите внимание на то, как вы обрабатываете загруженные файлы (подумайте о потоках), вы можете заставить весь процесс использовать очень мало памяти, даже для того, что традиционно было бы довольно дорогостоящими операциями. Этот подход требует очень небольшой фактической настройки для вашего приложения, чтобы он работал, и никакой реальной модификации вашего кода, но для этого требуется конкретная среда (сервер Apache), а также возможность ее настройки.

Мне также повезло с помощью jQuery-File-Upload, который поддерживает хорошие вещи, такие как загруженные и возобновляемые загрузки. Без чего-то вроде mod_porter это может по-прежнему связывать весь поток выполнения во время загрузки, но при этом он должен быть приличным в памяти, если все сделано правильно. Это также приводит к тому, что файл "закрывается" и, как результат, легко обрабатывается. Этот подход потребует корректировки уровня вашего представления для реализации и не будет работать во всех браузерах.

Вы упомянули FTP и bittorrent как возможные варианты. Это не так плохо, как вы думаете, поскольку вы все равно можете получить файлы, близкие к серверу. Они даже не являются взаимоисключающими, что приятно, потому что (как вы указали) им нужен дополнительный клиент, который может или не может присутствовать на загружающей машине. Как это работает, в основном, вы создали область для них, чтобы свалить на то, что видно вашему приложению. Затем, если вам нужно выполнить какую-либо обработку, вы запускаете задание cron (или что-то еще), чтобы отслеживать это местоположение для загрузки и запускать метод обработки ваших серверов. Это не дает вам немедленного ответа, который могут предоставить вышеприведенные методы, но вы можете установить интервал настолько малым, чтобы приближаться. Единственное реальное преимущество этого метода заключается в том, что используемые протоколы лучше подходят для передачи больших файлов, дополнительные требования к клиенту и фрагментированный процесс обычно перевешивают любые выгоды от этого, по моему опыту.

Если вам вообще не нужна какая-либо обработка, лучшим вариантом может быть просто перейти к S3 с ними. Это решение падает во втором, что вам действительно нужно делать с файлами, отличными от серверов, в качестве статических активов....

У меня нет опыта использования HTML5 FileSystemAPI в приложении rails, поэтому я не могу говорить с этой точкой, хотя кажется, что это значительно ограничит клиентов, которые вы можете поддерживать.

К сожалению, нет ни одной настоящей серебряной пули. Все эти параметры должны быть сопоставлены с вашей средой в контексте того, что вы пытаетесь выполнить. Например, вы не сможете настроить свой веб-сервер или надолго писать в свою локальную файловую систему. Для чего это стоит, я думаю, что jQuery-File-Upload, вероятно, лучший выбор в большинстве сред, поскольку он действительно требует модификации для вашего приложения, поэтому вы можете легко перенести реализацию в другую среду.


http://www.jedi.be/blog/2009/04/10/rails-and-large-large-file-uploads-looking-at-the-alternatives/ имеет некоторые хорошие сравнения параметров, в том числе и вне Rails.

Прошу пройти через это. Это было полезно в моем случае

Еще один сайт, который нужно посетить: http://bclennox.com/extremely-large-file-uploads-with-nginx-passenger-rails-and-jquery

Пожалуйста, дайте мне знать, если это не сработает


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

http://tus.io/


Я бы обошел сервер rails и разместил ваши большие файлы (разбитые на куски) прямо из браузера на Amazon Simple Storage. Взгляните на этот пост на разделение файлов с помощью JavaScript. Мне немного любопытно, насколько результативна эта установка, и я чувствую, что в этот уик-энд мне нравятся такие настройки.


Я думаю, что Брэд Верт прибил ответ

только один подход может быть загружен непосредственно на S3 (и даже если вам нужна некоторая переработка после того, как вы сможете теоретически использовать aws lambda для уведомления вашего приложения... но, честно говоря, я просто угадываю здесь, я о для решения той же самой проблемы, я расскажу об этом позже)

http://aws.amazon.com/articles/1434

если вы используете несущую волну

licensed under cc by-sa 3.0 with attribution.