기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
사용 모범 사례 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의 NettyNioAsyncHttpClient
SslProvider
과 같이 사용합니다. 테스트 결과 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를 분석하는 것이 좋습니다.