문제 해결 FAQ - AWS SDK for Kotlin

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

문제 해결 FAQ

애플리케이션에서 AWS SDK for Kotlin 를 사용할 때이 주제에 나열된 몇 가지 문제가 발생할 수 있습니다. 다음 제안을 사용하면 근본 원인을 파악하고 오류를 해결하는 데 도움이 됩니다.

"연결 닫힘" 문제를 해결하려면 어떻게 해야 합니까?

다음 유형 중 하나와 같은 예외로 '연결 닫힘' 문제가 발생할 수 있습니다.

  • IOException: unexpected end of stream on <URL>

  • EOFException: \n not found: limit=0

  • HttpException: AWS_ERROR_HTTP_CONNECTION_CLOSED: The connection has closed or is closing.; crtErrorCode=2058; HttpErrorCode(CONNECTION_CLOSED)

이러한 예외는 SDK에서 서비스로의 TCP 연결이 예기치 않게 닫히거나 재설정되었음을 나타냅니다. 호스트, AWS 서비스 또는 NAT 게이트웨이, 프록시 또는 로드 밸런서와 같은 중개자가 연결을 종료했을 수 있습니다.

이러한 유형의 예외는 자동으로 재시도되지만 로깅 구성에 따라 SDK 로그에 계속 표시될 수 있습니다. 코드에 예외가 발생하면 활성 재시도 전략이 최대 시도 횟수 또는 토큰 버킷 재시도 횟수와 같이 구성된 제한을 소진했음을 나타냅니다. 재시도 전략에 대한 자세한 내용은이 가이드의 재시도 섹션을 참조하세요. 최대 시도 횟수에 도달하기 전에 예외가 발생하는 이유는 무엇입니까? 주제도 참조하세요.

최대 시도 횟수에 도달하기 전에 예외가 발생하는 이유는 무엇입니까?

경우에 따라 재시도할 것으로 예상되었지만 대신 발생했던 예외가 표시될 수 있습니다. 이러한 상황에서는 다음 단계를 통해 문제를 해결할 수 있습니다.

  • 예외를 재시도할 수 있는지 확인합니다. 예를 들어 잘못된 서비스 요청, 권한 부족, 존재하지 않는 리소스를 나타내는 예외와 같은 일부 예외는 재시도할 수 없습니다. SDK는 이러한 종류의 예외를 자동으로 재시도하지 않습니다. 에서 상속되는 예외를 포착SdkBaseException하는 경우 부울 속성을 확인하여 SDK가 예외를 재시도할 수 있다고 판단했는지 SdkBaseException.sdkErrorMetadata.isRetryable 확인할 수 있습니다.

  • 예외가 코드에 발생하고 있는지 확인합니다. 일부 예외는 로그 메시지에 정보로 표시되지만 실제로 코드에 발생하지는 않습니다. 예를 들어 SDK가 여러 backoff-and-retry 가능한 예외가 로깅될 수 있습니다. SDK 작업을 호출하면 구성된 재시도 설정에서 처리하지 않은 경우에만 예외가 발생합니다.

  • 구성된 재시도 설정을 확인합니다. 재시도 전략 및 재시도 정책에 대한 자세한 내용은이 가이드의 재시도 섹션을 참조하세요. 코드가 예상한 설정 또는 자동 기본값을 사용하고 있는지 확인합니다.

  • 재시도 설정을 조정하는 것이 좋습니다. 이전 항목을 확인했지만 문제가 해결되지 않은 경우 재시도 설정을 조정하는 것이 좋습니다.

    • 최대 시도 횟수를 늘립니다. 기본적으로 작업에 대한 최대 시도 횟수는 3회입니다. 이것이 충분하지 않고 기본 설정에서 여전히 예외가 발생하는 경우 클라이언트 구성에서 retryStrategy.maxAttempts 속성을 늘리는 것이 좋습니다. 자세한 정보는 최대 시도 횟수을 참조하세요.

    • 지연 설정을 늘립니다. 일부 예외는 기본 조건이 해결될 가능성이 있기 전에 너무 빨리 재시도될 수 있습니다. 이 문제가 의심되는 경우 클라이언트 구성에서 retryStrategy.delayProvider.initialDelay 또는 retryStrategy.delayProvider.maxBackoff 속성을 늘리는 것이 좋습니다. 자세한 정보는 지연 및 백오프을 참조하세요.

    • 회로 차단기 모드를 비활성화합니다. SDK는 기본적으로 각 서비스 클라이언트에 대한 토큰 버킷을 유지합니다. SDK가 요청을 시도하고 재시도 가능한 예외와 함께 실패하면 토큰 수가 감소하고, 요청이 성공하면 토큰 수가 증가합니다.

      기본적으로이 토큰 버킷이 남은 토큰이 0개에 도달하면 회로가 끊어집니다. 회로가 끊어지면 SDK는 재시도와 첫 번째 시도에서 실패한 현재 및 후속 요청을 즉시 비활성화하여 예외를 발생시킵니다. SDK는 초기 시도가 성공하면 토큰 버킷에 충분한 용량을 반환한 후 재시도를 다시 활성화합니다. 이 동작은 의도적인 것이며 서비스 중단 및 서비스 복구 중에 재시도 폭풍을 방지하도록 설계되었습니다.

      SDK가 구성된 최대 시도까지 계속 재시도하도록 하려면 클라이언트 구성에서 retryStrategy.tokenBucket.useCircuitBreakerMode 속성을 false로 설정하여 회로 차단기 모드를 비활성화하는 것이 좋습니다. 이 속성을 false로 설정하면 SDK 클라이언트는 토큰 버킷이 추가 재시도를 중단하지 않고 충분한 용량에 도달할 때까지 기다렸다가 남은 토큰이 0개인 경우 예외가 발생할 수 있습니다.

NoSuchMethodError 또는 NoClassDefFoundError를 수정하려면 어떻게 해야 합니까?

이러한 오류는 가장 일반적으로 종속성 누락 또는 충돌로 인해 발생합니다. 자세한 정보는 종속성 충돌을 해결하려면 어떻게 해야 합니까?을 참조하세요.

NoClassDefFoundError 대한가 표시됩니다. okhttp3/coroutines/ExecuteAsyncKt

이는 특히 OkHttp의 종속성 문제를 나타냅니다. 자세한 정보는 애플리케이션의 OkHttp 버전 충돌 해결을 참조하세요.