기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
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 구성
좋은 출발점으로 SDK는 스마트 구성 기본값 기능을 제공합니다. 이 기능은 버전 2.17.102부터 사용할 수 있습니다. 사용 사례에 따라 적절한 구성 값을 제공하는 모드를 선택합니다.
Netty 기반 HTTP 클라이언트에 OpenSSL 사용
기본적으로 SDK의 NettyNioAsyncHttpClient
SslProvider
과 같이 사용합니다. 테스트 결과 OpenSSL이 JDK의 기본 구현보다 성능이 더 좋은 것으로 나타났습니다. Netty 커뮤니티에서도 OpenSSL 사용을 권장합니다
OpenSSL을 사용하려면 종속성에 netty-tcnative
을 추가하세요. 구성 세부 정보는 Netty 프로젝트 설명서
프로젝트에 맞게 netty-tcnative
를 구성한 후 NettyNioAsyncHttpClient
인스턴스는 자동으로 OpenSSL을 선택합니다. 또는 다음 코드 조각과 같이 NettyNioAsyncHttpClient
빌더를 사용하여 SslProvider
를 명시적으로 설정할 수 있습니다.
NettyNioAsyncHttpClient.builder() .sslProvider(SslProvider.OPENSSL) .build();
API 타임아웃 설정
SDK는 연결 제한 시간 및 소켓 제한 시간과 같은 일부 제한 시간 옵션에 대한 기본값
ClientOverrideConfiguration#apiCallAttemptTimeout
및 ClientOverrideConfiguration#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를 분석하는 것이 좋습니다.