Время ожидания AWS SDK по умолчанию составляет 120000 мс. Если тайм-аут вашей лямбды короче, вы никогда не получите фактическую ошибку.
Либо увеличьте время ожидания AWS
var AWS = require('aws-sdk');
var s3 = new AWS.S3({httpOptions: {timeout: 3000}});
, либо увеличьте время ожидания лямбды.
Относительно запроса/ответа:
для Расположенного запроса Вы могли получить три различных ответа:
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
Я не могу ответить на все Ваши вопросы, но здесь являюсь моим взятием на двух из них.
Существует две вещи, которые необходимо рассмотреть о размере блока:
Я рекомендовал бы пойти с меньшими блоками данных. Необходимо будет сделать некоторый тест для наблюдения, какой размер является лучшим для цели все же.
Необходимо записать блоки данных в в буфере памяти, и затем когда это - полная запись это к диску. Если Вы собираетесь загрузить большие файлы, это может быть неприятно для Ваших пользователей, если у них заканчивается RAM. Если я буду помнить правильно запросы хранилищ IIS, меньшие, чем 256 КБ в памяти, то что-либо большее будет записано в диск, можно хотеть рассмотреть подобный подход.
Я не эксперт по C++, однако, я когда-то сделал приложение .NET, для которого была нужна схожая функциональность (загрузите планирование, поддержку резюме, расположив по приоритетам загрузки),
я использовал биты Microsoft (Фон Интеллектуальный Сервис Передачи) компонент - который был разработан в c. БИТАХ использования обновления окон также. Я пошел для этого решения, потому что я не думаю, что я - достаточно хорошее программист для записи чего-то вроде этого уровня сам ;-)
Хотя я не уверен, можно ли получить код БИТОВ - я действительно думаю, что необходимо просто взглянуть на его документацию, которая могла бы помочь Вам понять, как они реализовали его, архитектура, интерфейсы, и т.д.
Здесь это - http://msdn.microsoft.com/en-us/library/aa362708 (По сравнению с 85) .aspx
Помимо отслеживания того, что было смещениями, отмечающими начало Ваших сегментов и каждой длины сегмента (если Вы не хотите вычислить это на резюме, которое включило бы вид список смещения и вычислило бы расстояние между двумя из них) Вы захотите проверить заголовок Принимать-диапазонов ответа HTTP, отправленного сервером, чтобы удостовериться, что это поддерживает использование заголовка Диапазона. Лучшим способом указать диапазон является "Диапазон: bytes=START_BYTE-END_BYTE" и диапазон Вы запрашиваете, включает и START_BYTE и байт END_BYTE, таким образом состоящий из +1 байта (END_BYTE-START_BYTE).
Запрос микро блоков является чем-то, чему я советовал бы против того, поскольку Вы могли бы быть помещены в черный список правилом брандмауэра заблокировать лавинную рассылку HTTP. В целом я предложил бы, чтобы Вы не делали блоки меньшими, чем 1 МБ и не делали больше чем 10 блоков. В зависимости от того, какой контроль Вы планируете иметь на своей загрузке, если у Вас есть регулятор уровня сокета, можно рассмотреть запись только один раз в 32K, по крайней мере, или запись данных асинхронно.
Я не мог прокомментировать идею MMF, но если загруженный файл является большим, это не будет хорошей идеей, поскольку Вы съедите много RAM и в конечном счете даже заставите систему подкачивать, который не эффективен.
Об обработке блоков Вы могли просто создать несколько файлов - один на сегмент, дополнительно предварительно выделить дисковое пространство, заполняющее файл столькими же \x00 сколько размер блока (предварительное выделение могло бы сохранить Вас когда-то, в то время как Вы пишете во время загрузки, но сделаете запуск загрузки медленнее), и затем наконец просто запишите все блоки последовательно в заключительный файл.
Одна вещь, которой необходимо остерегаться, состоит в том, что несколько серверов имеют максимум предел параллельных соединений, и Вы не узнаете его заранее, таким образом, Вы должны быть готовы обработать http ошибки/тайм-ауты и изменить размер блоков или создать очередь блоков в случае, если Вы создали больше блоков, чем максимум соединения.
Это кажется мне, Вы хотели бы ограничить размер на блок загрузки. Большие блоки могли вынудить Вас повторить загрузку данных если соединение, прерванное близко к концу части данных. Особенно проблема с более медленными соединениями.
для поддержки возобновления паузы посмотрите на этот простой пример Простой менеджер загрузок на Qt с поддержкой паузы/возобновления
Не совсем ответ на исходные вопросы, но стоит упомянуть еще одну вещь: возобновляемый загрузчик должен также проверять дату последнего изменения ресурса, прежде чем пытаться захватить следующий фрагмент чего-то, что может изменились.