Управление соединениями 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, которые вам нужно выполнить.