AWS SDK for Java 2.x 사용 모범 사례
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 요청을 설정합니다.
서비스 클라이언트를 재사용하여 성능 향상
각 서비스 클라이언트는 자체 HTTP 연결 풀을 유지합니다. 풀에 이미 있는 연결을 새 요청에 재사용하여 새 연결을 설정하는 시간을 줄일 수 있습니다. 효과적으로 사용되지 않는 연결 풀이 너무 많아서 발생하는 오버헤드를 방지하려면 클라이언트의 단일 인스턴스를 공유하는 것이 좋습니다. 모든 서비스 클라이언트는 스레드로부터 안전합니다.
클라이언트 인스턴스를 공유하지 않으려면 클라이언트가 필요하지 않을 때 인스턴스를 close() 호출하여 리소스를 릴리스하세요.
미사용 서비스 클라이언트를 닫아 리소스 누수 방지
더 이상 필요하지 않은 경우 서비스 클라이언트를 종료해 스레드 등의 리소스를 릴리스합니다. 클라이언트 인스턴스를 공유하지 않으려면 클라이언트가 필요하지 않을 때 인스턴스를 close() 호출하여 리소스를 릴리스하세요.
입력 스트림을 닫아 연결 풀 소진 방지
ResponseInputStream를 사용하여 직접 작업하는 경우 S3Client#getObject와 같은 스트리밍 작업의 경우 다음을 수행하는 것이 좋습니다.
-
가능한 한 빨리 입력 스트림에서 모든 데이터를 읽습니다.
-
가능한 한 빨리 입력 스트림을 닫습니다.
입력 스트림은 HTTP 연결의 데이터에 대한 직접적인 스트림이고 스트림의 모든 데이터를 읽고 스트림을 닫을 때까지 기본 HTTP 연결을 재사용할 수 없기 때문에 이러한 권장 사항을 제시합니다. 이러한 규칙을 따르지 않으면 클라이언트는 열려 있지만 사용되지 않는 HTTP 연결을 너무 많이 할당하여 리소스가 부족해질 수 있습니다.
애플리케이션 워크로드에 대한 HTTP 성능 최적화
SDK는 일반 사용 사례에 적용되는 기본 http 구성
좋은 출발점으로 SDK는 스마트 구성 기본값 기능을 제공합니다. 이 기능은 버전 2.17.102부터 사용할 수 있습니다. 사용 사례에 따라 적절한 구성 값을 제공하는 모드를 선택합니다.
비동기식 클라이언트용 OpenSSL로 SSL 성능 개선
기본적으로 SDK의 NettyNioAsyncHttpClientSslProvider과 같이 사용합니다. 테스트 결과 OpenSSL이 JDK의 기본 구현보다 성능이 더 좋은 것으로 나타났습니다. Netty 커뮤니티에서도 OpenSSL 사용을 권장합니다
OpenSSL을 사용하려면 종속성에 netty-tcnative을 추가하세요. 구성 세부 정보는 Netty 프로젝트 설명서
프로젝트에 맞게 netty-tcnative를 구성한 후 NettyNioAsyncHttpClient 인스턴스는 자동으로 OpenSSL을 선택합니다. 또는 다음 코드 조각과 같이 NettyNioAsyncHttpClient 빌더를 사용하여 SslProvider를 명시적으로 설정할 수 있습니다.
NettyNioAsyncHttpClient.builder() .sslProvider(SslProvider.OPENSSL) .build();
SDK 지표를 사용하여 애플리케이션 성능 모니터링
Java용 SDK는 애플리케이션의 서비스 클라이언트에 대한 메트릭을 수집할 수 있습니다. 이러한 지표를 사용하여 성능 문제를 식별하고, 전반적인 사용 추세를 검토하고, 반환된 서비스 클라이언트 예외를 검토하거나, 특정 문제를 이해하기 위해 자세히 알아볼 수 있습니다.
애플리케이션 성능을 더 깊이 이해하려면 지표를 수집한 다음 Amazon CloudWatch Logs를 분석하는 것이 좋습니다.