AWS SDK for Java 2.x의 모범 사례 - AWS SDK for Java 2.x

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS SDK for Java 2.x의 모범 사례

이 단원에는 SDK for Java 2.x를 사용하기 위한 모범 사례가 나열되어 있습니다.

가능하면 SDK 클라이언트를 재사용하세요.

각 SDK 클라이언트는 자체 HTTP 연결 풀을 유지합니다. 풀에 이미 있는 연결을 새 요청에 재사용하여 새 연결을 설정하는 시간을 줄일 수 있습니다. 효과적으로 사용되지 않는 연결 풀이 너무 많아서 발생하는 오버헤드를 방지하려면 클라이언트의 단일 인스턴스를 공유하는 것이 좋습니다. 모든 SDK 클라이언트는 스레드로부터 안전합니다.

클라이언트 인스턴스를 공유하지 않으려면 클라이언트가 필요하지 않을 때 인스턴스를 close() 호출하여 리소스를 릴리스하세요.

클라이언트 작업의 입력 스트림 닫기

ResponseInputStream를 사용하여 직접 작업하는 경우 S3Client#getObject와 같은 스트리밍 작업의 경우 다음을 수행하는 것이 좋습니다.

  • 가능한 한 빨리 입력 스트림에서 모든 데이터를 읽습니다.

  • 가능한 한 빨리 입력 스트림을 닫습니다.

입력 스트림은 HTTP 연결의 데이터에 대한 직접적인 스트림이고 스트림의 모든 데이터를 읽고 스트림을 닫을 때까지 기본 HTTP 연결을 재사용할 수 없기 때문에 이러한 권장 사항을 제시합니다. 이러한 규칙을 따르지 않으면 클라이언트는 열려 있지만 사용되지 않는 HTTP 연결을 너무 많이 할당하여 리소스가 부족해질 수 있습니다.

성능 테스트를 기반으로 HTTP 구성을 조정

SDK는 일반 사용 사례에 적용되는 기본 http 구성 세트를 제공합니다. 고객은 사용 사례에 따라 애플리케이션에 대한 HTTP 구성을 조정하는 것이 좋습니다.

좋은 출발점으로 SDK는 스마트 구성 기본값 기능을 제공합니다. 이 기능은 버전 2.17.102부터 사용할 수 있습니다. 사용 사례에 따라 적절한 구성 값을 제공하는 모드를 선택합니다.

Netty 기반 HTTP 클라이언트에 OpenSSL 사용

기본적으로 SDK의 NettyNioAsyncHttpClient는 JDK의 기본 SSL 구현을 SslProvider과 같이 사용합니다. 테스트 결과 OpenSSL이 JDK의 기본 구현보다 성능이 더 좋은 것으로 나타났습니다. Netty 커뮤니티에서도 OpenSSL 사용을 권장합니다.

OpenSSL을 사용하려면 종속성에 netty-tcnative을 추가하세요. 구성 세부 정보는 Netty 프로젝트 설명서를 참조하세요.

프로젝트에 맞게 netty-tcnative를 구성한 후 NettyNioAsyncHttpClient 인스턴스는 자동으로 OpenSSL을 선택합니다. 또는 다음 코드 조각과 같이 NettyNioAsyncHttpClient 빌더를 사용하여 SslProvider를 명시적으로 설정할 수 있습니다.

NettyNioAsyncHttpClient.builder() .sslProvider(SslProvider.OPENSSL) .build();

API 타임아웃 설정

SDK는 연결 제한 시간 및 소켓 제한 시간과 같은 일부 제한 시간 옵션에 대한 기본값을 제공하지만 API 호출 제한 시간이나 개별 API 호출 시도 제한 시간에 대해서는 기본값을 제공하지 않습니다. 개별 시도와 전체 요청 모두에 대해 제한 시간을 설정하는 것이 좋습니다. 이렇게 하면 요청 시도를 완료하는 데 시간이 더 오래 걸리거나 치명적인 네트워크 문제를 일으킬 수 있는 일시적인 문제가 있는 경우 최적의 방식으로 애플리케이션이 빠르게 실패하도록 보장합니다.

ClientOverrideConfiguration#apiCallAttemptTimeoutClientOverrideConfiguration#apiCallTimeout를 사용하여 서비스 클라이언트의 모든 요청에 대한 제한 시간을 구성할 수 있습니다.

다음 예제는 사용자 지정 시간 제한 값을 사용하는 Amazon S3 클라이언트의 구성을 보여줍니다.

S3Client.builder() .overrideConfiguration( b -> b.apiCallTimeout(Duration.ofSeconds(<custom value>)) .apiCallAttemptTimeout(Duration.ofMillis(<custom value>))) .build();
apiCallAttemptTimeout

이 설정은 단일 HTTP 시도 시간을 설정합니다. 이 시간이 지나면 API 호출을 재시도할 수 있습니다.

apiCallTimeout

이 속성의 값은 모든 재시도를 포함하여 전체 실행에 걸리는 시간을 구성합니다.

서비스 클라이언트에서 이러한 제한 시간 값을 설정하는 대신 RequestOverrideConfiguration#apiCallTimeout()RequestOverrideConfiguration#apiCallAttemptTimeout()를 사용하여 단일 요청을 구성할 수 있습니다.

다음 예시에서는 사용자 지정 제한 시간 값을 사용하여 단일 listBuckets 요청을 구성합니다.

s3Client.listBuckets(lbr -> lbr.overrideConfiguration( b -> b.apiCallTimeout(Duration.ofSeconds(<custom value>)) .apiCallAttemptTimeout(Duration.ofMillis(<custom value>))));

이러한 속성을 함께 사용하면 재시도 전체에 걸쳐 모든 시도에 소요되는 총 시간에 대한 엄격한 제한을 설정합니다. 또한 느린 요청에 대해 빠르게 실패하도록 개별 HTTP 요청을 설정합니다.

지표 사용

Java용 SDK는 애플리케이션의 서비스 클라이언트에 대한 메트릭을 수집할 수 있습니다. 이러한 지표를 사용하여 성능 문제를 식별하고, 전반적인 사용 추세를 검토하고, 반환된 서비스 클라이언트 예외를 검토하거나, 특정 문제를 이해하기 위해 자세히 알아볼 수 있습니다.

애플리케이션 성능을 더 깊이 이해하려면 지표를 수집한 다음 Amazon CloudWatch Logs를 분석하는 것이 좋습니다.