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

С Rails я следовал этой статье Heroku, чтобы разрешить прямую загрузку файлов в S3 Bucket. Я действительно следовал этой статье, потому что моя предыдущая реализация не работала для многоэтапных загрузок (так, больших файлов). Как только я реализовал этот метод, большие файлы загружались просто отлично, за исключением действительно больших файлов.

Я должен отметить, что я немного отклонился от этой статьи, потому что я использую v1 aws жемчужина, из-за нашей версии Rails.

Вот как я настроен:

S3_BUCKET = AWS::S3.new.buckets[ENV['S3_BUCKET_NAME']]

def set_s3_post_url
  @s3_media_post_url = S3_BUCKET.presigned_post(key: "product_media/#{SecureRandom.uuid}-${filename}", success_action_status: '201', acl: 'public-read')
end

Как уже упоминалось, это работает для больших файлов (~1 ГБ), но когда я пытаюсь загрузить один файл, скажем, 10 ГБ, он попадает в основном загруженное состояние, а затем случайно завершается неудачей. Иногда через 20 минут, иногда через час. Я подумал, что, возможно, срок действия подписанного URL истекает, поэтому я явно установил длительный срок действия с помощью expires: Time.now + 4.hours, но это не сработало.

Буду очень признателен за помощь, если у кого-нибудь появятся идеи!

Обновить

Я попробовал @bbozo ответ об использовании maxChunkSize, но, к сожалению, это не похоже на это. Однако, когда я смотрел XHR-запросы в консоли, тот, который не прошел, вернул следующий XML-ответ от AWS:

<Error>
    <Code>InternalError</Code>
    <Message>We encountered an internal error. Please try again.</Message>
    <RequestId>1231BD4A29EE5291</RequestId>
    <HostId>f5muQPj2lT2Tmqi49ffqjT4ueLimYvrWUJL6WRW+F7vgm2rL1+FOD3pmsKOEYxFaSFXzLiEZjTg=</HostId>
</Error>

3 ответа

План А

Правильно ли вы настроили загрузку по частям?

https://github.com/blueimp/jQuery-File-Upload/wiki/Chunked-file-uploads

В статье Heroku ничего не говорится о настройке порционных загрузок в плагине jquery, который обрабатывает загрузку файлов,

FAQ говорит:

С помощью плагина jQuery File Upload можно загружать файлы размером до 4 ГБ. При использовании загрузки файлов Chunked (с кусками меньше 4 ГБ) потенциальный размер файла не ограничен. Ограничение 4 ГБ связано с некоторыми ограничениями браузера, которые могут быть исправлены в будущих обновлениях этих браузеров.

Документация для порционных загрузок находится здесь, вы должны определить maxChunkSize свойство, которое определяет размер чанка

$('#fileupload').fileupload({
    maxChunkSize: 10000000 // 10 MB
});

План б

Вы можете создать минималистичный экземпляр node.js, который принимает загрузку файла и передает его на S3 через AWS SDK.

Вы также можете запустить его на бесплатном экземпляре heroku, потому что, вероятно, ему разрешено спать 6 часов в день, и у меня есть хороший опыт размещения сервисов загрузки файлов таким образом

Если вы используете загрузку файла heroku + s3, я предлагаю использовать гем 's3_direct_upload'. С его помощью вы можете загрузить файл в AWS::S3 без подключения к серверу heroku. Это создает прямую связь между вашим сервером и s3-bucket.

Для более подробной информации вы можете использовать эту ссылку

При этом вы должны использовать немного JavaScript, если хотите проверить содержимое или сделать некоторые проверки на размер файла.

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

Возможно, вы захотите рассмотреть что-то кроме HTTP для загрузки. Продукт, которым я управляю, Signiant Flight, основан на UDP и легко обрабатывает очень большие файлы. Цены начинаются с $12 тыс. / Год.

Также доступны другие бесплатные UDP-инструменты с открытым исходным кодом, такие как UDT ( http://udt.sourceforge.net/) и Tsunami ( http://tsunami-udp.sourceforge.net/). Чтобы использовать UDP, вам понадобится сервер в EC2 для подключения, а затем этот сервер запишет данные в S3.

Flight - это управляемая служба передачи файлов - мы запускаем серверы в облаке для вас и можем развивать скорость до 800–900 Мбит / с.

Другие вопросы по тегам