реализация менеджера загрузок, который поддерживает возобновление

Время ожидания AWS SDK по умолчанию составляет 120000 мс. Если тайм-аут вашей лямбды короче, вы никогда не получите фактическую ошибку.

Либо увеличьте время ожидания AWS

var AWS = require('aws-sdk');
var s3 = new AWS.S3({httpOptions: {timeout: 3000}});

, либо увеличьте время ожидания лямбды.

11
задан Idan K 4 April 2009 в 16:08
поделиться

7 ответов

Относительно запроса/ответа:

для Расположенного запроса Вы могли получить три различных ответа:

206 Partial Content - возобновление, поддерживаемое и возможное; проверьте заголовок Довольного Диапазона на размер/диапазон ответа
200 OK - диапазоны байта ("возобновление") не поддерживаемый, целый ресурс ("файл") следуют
416 Requested Range Not Satisfiable - неправильный диапазон (мимо EOF и т.д.)

Довольный диапазон usu. похож на это: Content-Range: bytes 21010-47000/47022, это - байты start-end/total.

Проверьте спецификацию HTTP на детали, особенно разделы 14.5, 14.16 и 14.35

7
ответ дан 3 December 2019 в 06:22
поделиться

Я не могу ответить на все Ваши вопросы, но здесь являюсь моим взятием на двух из них.

Размер блока

Существует две вещи, которые необходимо рассмотреть о размере блока:

  1. Чем меньше они, тем более служебными Вы становитесь форма, отправляющая Запрос HTTP.
  2. С большими блоками Вы рискуете повторно загружать те же данные дважды, если одна загрузка перестала работать.

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

В памяти по сравнению с файлами

Необходимо записать блоки данных в в буфере памяти, и затем когда это - полная запись это к диску. Если Вы собираетесь загрузить большие файлы, это может быть неприятно для Ваших пользователей, если у них заканчивается RAM. Если я буду помнить правильно запросы хранилищ IIS, меньшие, чем 256 КБ в памяти, то что-либо большее будет записано в диск, можно хотеть рассмотреть подобный подход.

3
ответ дан 3 December 2019 в 06:22
поделиться

Я не эксперт по C++, однако, я когда-то сделал приложение .NET, для которого была нужна схожая функциональность (загрузите планирование, поддержку резюме, расположив по приоритетам загрузки),

я использовал биты Microsoft (Фон Интеллектуальный Сервис Передачи) компонент - который был разработан в c. БИТАХ использования обновления окон также. Я пошел для этого решения, потому что я не думаю, что я - достаточно хорошее программист для записи чего-то вроде этого уровня сам ;-)

Хотя я не уверен, можно ли получить код БИТОВ - я действительно думаю, что необходимо просто взглянуть на его документацию, которая могла бы помочь Вам понять, как они реализовали его, архитектура, интерфейсы, и т.д.

Здесь это - http://msdn.microsoft.com/en-us/library/aa362708 (По сравнению с 85) .aspx

4
ответ дан 3 December 2019 в 06:22
поделиться

Помимо отслеживания того, что было смещениями, отмечающими начало Ваших сегментов и каждой длины сегмента (если Вы не хотите вычислить это на резюме, которое включило бы вид список смещения и вычислило бы расстояние между двумя из них) Вы захотите проверить заголовок Принимать-диапазонов ответа HTTP, отправленного сервером, чтобы удостовериться, что это поддерживает использование заголовка Диапазона. Лучшим способом указать диапазон является "Диапазон: bytes=START_BYTE-END_BYTE" и диапазон Вы запрашиваете, включает и START_BYTE и байт END_BYTE, таким образом состоящий из +1 байта (END_BYTE-START_BYTE).

Запрос микро блоков является чем-то, чему я советовал бы против того, поскольку Вы могли бы быть помещены в черный список правилом брандмауэра заблокировать лавинную рассылку HTTP. В целом я предложил бы, чтобы Вы не делали блоки меньшими, чем 1 МБ и не делали больше чем 10 блоков. В зависимости от того, какой контроль Вы планируете иметь на своей загрузке, если у Вас есть регулятор уровня сокета, можно рассмотреть запись только один раз в 32K, по крайней мере, или запись данных асинхронно.

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

Об обработке блоков Вы могли просто создать несколько файлов - один на сегмент, дополнительно предварительно выделить дисковое пространство, заполняющее файл столькими же \x00 сколько размер блока (предварительное выделение могло бы сохранить Вас когда-то, в то время как Вы пишете во время загрузки, но сделаете запуск загрузки медленнее), и затем наконец просто запишите все блоки последовательно в заключительный файл.

Одна вещь, которой необходимо остерегаться, состоит в том, что несколько серверов имеют максимум предел параллельных соединений, и Вы не узнаете его заранее, таким образом, Вы должны быть готовы обработать http ошибки/тайм-ауты и изменить размер блоков или создать очередь блоков в случае, если Вы создали больше блоков, чем максимум соединения.

3
ответ дан 3 December 2019 в 06:22
поделиться

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

0
ответ дан 3 December 2019 в 06:22
поделиться

для поддержки возобновления паузы посмотрите на этот простой пример Простой менеджер загрузок на Qt с поддержкой паузы/возобновления

0
ответ дан 3 December 2019 в 06:22
поделиться

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

2
ответ дан 3 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: