Большие загрузки 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 Мбит / с.