Управление соединениями AmazonS3

Есть ли рекомендуемый способ управления соединением с AmazonS3 при работе с AWS?

Типичный код Amazon S3 (взятый из официального образца Amazon) выглядит обычно так:

AmazonS3 s3 = new AmazonS3Client(...);
...
s3.putObject(new PutObjectRequest(bucketName, project.getName() + "/" + imageFile.getName(), imageFile));

Ниже приведены вопросы:

  • Хорошо ли поддерживать один AmazonS3Client, используемый всеми в коде, или лучше создать его для каждого вызова?

  • Существует ли концепция пула соединений, например, при работе с MySQL?

  • Возникают такие вопросы, как разъединение (MySQL-аналогия: MySQL была перезапущена), так что AmazonS3Client станет недействительным и потребует повторного создания? Что было бы правильным способом справиться с отключением, если да?

  • Кто-нибудь знает, какие функции обеспечивают интеграция spring с aws at: https://github.com/spring-projects/spring-integration-extensions/tree/master/spring-integration-aws

спасибо.

Ответы

Ответ 1

Я повторю вопросы, чтобы быть ясными:

Хорошо ли поддерживать один AmazonS3Client, используемый все в коде или лучше создать один на каждый вызов?

Все классы клиентов в Java SDK являются потокобезопасными, поэтому обычно лучше повторить использование одного клиента, чем создавать новые. Или несколько, если вы работаете одновременно в нескольких регионах или учетных данных.

Существует ли концепция пула соединений, например, при работе с MySQL?

Да, в клиенте есть управление подключением, особенно если вы используете непосредственно TransferManager, а не AmazonS3Client.

см. ниже: http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferManager.html

Есть такие вопросы, как разъединение (MySQL аналогия: MySQL был перезапущен) что AmazonS3Client станет недействительным и потребует Воссоздание? Каким будет правильный способ справиться с отключением, если так?

По умолчанию клиент выполняет повторные попытки с экспоненциальным отклонением для восстанавливаемых ошибок. Если он действительно терпит неудачу/отключается, вам необходимо обработать исключение, соответствующее вашему приложению. см. http://docs.aws.amazon.com/general/latest/gr/api-retries.html

Кто-нибудь знает, какие страхи предоставляются интеграцией springс aws по адресу: https://github.com/spring-projects/spring-integration-extensions/tree/master/spring-integration-aws

Он предоставляет декларативные классы инстанцирования, инъекции и утилиты для упрощения интеграции в проекты spring, аналогичным образом используются помощники JDBC, JMS и т.д.

Подробнее о советах и ​​трюках AWS SDK см.: http://aws.amazon.com/articles/3604?_encoding=UTF8&jiveRedirect=1

Ответ 2

Есть важные вещи, которые следует отметить по следующим двум вопросам:

Хорошо ли поддерживать один AmazonS3Client, используемый всеми в коде, или лучше создать его на каждом вызове?

Создайте только один. У AmazonS3Client есть недостаток, который при сборе мусора очищает ресурсы, которые совместно используются другими экземплярами AmazonS3Client, в результате чего эти экземпляры становятся недействительными, даже если эти другие экземпляры находятся в середине обработки загрузки или загрузки. У нас была эта проблема, когда мы создавали AmazonS3Client для каждого запроса. Амазонка, по-видимому, не считает это ошибкой. Эту ошибку можно избежать, создав только один AmazonS3Client, поддерживая ее в течение всего срока службы приложения и используя ее во всех потоках вашего кода.

Возникают такие вопросы, как разъединение (MySQL-аналогия: MySQL была перезапущена), так что AmazonS3Client станет недействительным и потребует повторного создания? Каким будет правильный способ отключить связь?

Загрузка и загрузка могут завершиться неудачно, но они не будут аннулировать AmazonS3Client, который все еще можно использовать. Правильный способ обращения с отключением, который не был успешно повторен AmazonS3Client, - это повторить попытку или сообщить о сбое, в зависимости от вашего приложения, и продолжать использовать AmazonS3Client для любых дополнительных взаимодействий S3, которые вам нужно выполнить.