Java SDK для AWS S3: RequestClientOptions.setReadLimit

Если мы рассмотрим этот код загрузки S3

val tm: TransferManager = ???
val putRequest = new PutObjectRequest(bucketName, keyName, inputStream, metaData)
putRequest.setStorageClass(storageClass)
putRequest.getRequestClientOptions.setReadLimit(100000)
tm.upload(putRequest)

В чем польза метода setReadLimit? Документ AWS SDK по Java содержит следующее описание:

Устанавливает необязательный предел чтения с отметкой и сбросом, используемый для целей подписи и повторных попыток. См. также: InputStream.mark(int)

Верно ли мое предположение в том, что оно должно обеспечить своего рода «контрольную точку», например, если сеть выйдет из строя в середине процесса загрузки, API (внутренне) выполнит повторную попытку с последней «отмеченной» позиции, а не из начало файла?


person lolski    schedule 08.05.2015    source источник


Ответы (1)


TransferManager действительно поддерживает «контрольную точку», как вы описываете, хотя это не имеет прямого отношения к параметру readLimit. S3 позволяет загружать большие объекты в несколько частей, а TransferManager автоматически сделает это за вас для загрузки через определенный размер. Если загрузка одной части не удалась, базовому AmazonS3Client нужно только повторить попытку загрузки этой отдельной части. Если вы передадите TransferManager File вместо InputStream, он может даже загрузить несколько частей файла параллельно, чтобы ускорить передачу.

Параметр readLimit используется, когда вы передаете TransferManager (или нижележащему AmazonS3Client) InputStream вместо File. По сравнению с файлом, в котором вы можете легко искать, если вам нужно повторить часть загрузки, интерфейс InputStream гораздо более ограничивающий. Для поддержки повторных попыток загрузки InputStream AmazonS3Client использует ссылку метка и reset методы интерфейса InputStream, markустанавливая поток в начале каждой загрузки и resetустанавливая метку, если необходимо повторить попытку.

Обратите внимание, что метод mark принимает параметр readlimit и обязан «запоминать» только столько байтов из InputStream, сколько вы запросили заранее. Некоторые потоки ввода реализуют mark, выделяя new byte[readlimit] для буферизации базовых данных в памяти, чтобы их можно было воспроизвести при вызове сброса, что делает опасным слепое mark использование длины загружаемого объекта (которая может составлять несколько гигабайт). Вместо этого AmazonS3Client по умолчанию вызывает mark со значением 128 КБ — если ваш InputStream заботится о readlimit, это означает, что AmazonS3Client не сможет повторить запросы, которые не удалось выполнить после отправки более первых 128 КБ.

Если вы используете такой InputStream и хотели бы выделить больше памяти для буферизации загруженных данных, чтобы AmazonS3Client мог повторить попытку при сбоях в дальнейшем при загрузке (или, наоборот, если вы хотите использовать меньший буфер и, возможно, увидеть больше сбоев ), вы можете настроить значение, которое будет использоваться через setReadLimit.

person David Murray    schedule 01.07.2015