RAILS как лучше загрузить большой файл › 2 Гб

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


person user2886647    schedule 30.03.2015    source источник


Ответы (2)


Есть несколько вариантов (чисто HTTP-сторона, даже не говоря о языках программирования).

Вопрос действительно зависит от вашей среды (сред), навыков, поддержки и т. д. Что я заметил в «реальном мире», так это то, что если вы отправляете> 100 МБ на сервер по HTTP-запросу, это не удастся. У ваших клиентов, скорее всего, очень плохая скорость загрузки (большинство интернет-соединений soho имеют> 10M вниз, но ‹1M вверх), поэтому вы в конечном итоге столкнетесь с тайм-аутом (маршрутизатор / таблицы nat / брандмауэр / веб-сервер / скрипты).

1) Действительно большой POST (плохая практика, потенциально может потреблять много памяти, сбой означает, что вам нужно начинать все сначала и оставляет ваш сервер открытым для DDoS)

2) Использование «модуля загрузки» для Apache/nginx (требуется компиляция и, как правило, много головной боли для его настройки, но он работает хорошо, может не работать со всеми ситуациями хостинга)

3) Потоковая передача в ваших клиентских и серверных скриптах. Работает хорошо. Я бы также рекомендовал разбивать ваши загрузки на ‹10 МБ, а в случае сбоя — возможность перезапуска чанков.

person Guru Evi    schedule 30.03.2015

У меня нет большого опыта работы с ди-джеем, но фоновая обработка имеет одинаковый подход ко всем инструментам.

Сначала вы должны просто загрузить свой файл куда-нибудь (файловая система, Amazon S3, что угодно). DJ не справится с этой задачей. Вы должны сделать это в своем действии контроллера.

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

Например, вы можете запустить DJ после фиксации в своей видеомодели, например

class Video < AR::Base
  after_commit :encode_in_background

  private

  def encode_in_background
    self.delay.encode(id)
  end

  def encode
    # code that runs in background
  end
end

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

person Stanislav Mekhonoshin    schedule 30.03.2015
comment
да вы правы. Но если я загружу файл размером 2 ГБ, моя локальная машина зависнет и не сможет выполнить запрос. - person user2886647; 30.03.2015
comment
Что ж, загрузка 2 ГБ на локальную машину - действительно тяжелая задача. Затем попробуйте какой-нибудь метод загрузки nginx. Но в любом случае, если вам нужно загружать такие огромные файлы, то ваш сервис достаточно специфичен, и у вас должны быть мощные серверы для решения таких задач (с большим количеством оперативной памяти и дискового пространства). - person Stanislav Mekhonoshin; 30.03.2015
comment
›2 ГБ может быть больше, чем позволяет ваш веб-сервер для почтового запроса. См. Apache: http://httpd.apache.org/docs/2.4/mod/core.html#limitrequestbody - person tvw; 19.07.2016