Kinesis Data Streams에서 ReadProvisionedThroughputExceeded 예외를 감지하고 문제를 해결하려면 어떻게 해야 하나요?

3분 분량
0

Amazon Kinesis Data Streams에서 ReadProvisionedThroughputExceeded 오류가 발생했는데 왜 이런 문제가 발생하는지 모르겠습니다.

간략한 설명

Kinesis Data Streams가 일정 기간 동안 GetRecords 호출을 제한할 때 ReadProvisionedThroughputExceeded 오류가 발생합니다.

다음 할당량을 초과할 경우 Amazon Kinesis 데이터 스트림이 다음과 같이 제한될 수 있습니다.

  • 각 샤드는 초당 최대 다섯 개의 읽기 트랜잭션 또는 각 샤드에 대해 초당 다섯 개의 GetRecords 호출을 지원합니다.
  • 각 샤드는 초당 2MiB의 최대 읽기 속도를 지원합니다.
  • GetRecords는 단일 샤드에서 호출당 최대 10MiB의 데이터와 호출당 최대 10,000개의 레코드를 검색합니다. GetRecords에 대한 호출이 10MiB의 데이터를 반환하는 경우 이후 5초 이내에 이루어진 후속 호출에서 오류가 발생합니다.

ReadProvisionedThroughputExceeded 오류가 발생하는 경우 다음 작업 중 하나를 완료하세요.

  • 문제의 근본 원인을 파악하세요.
  • 발생 가능한 마이크로버스트를 식별하세요.
  • Kinesis Data Streams 모범 사례를 따르세요.

해결 방법

문제의 근본 원인 파악

Data Streams에서 ReadProvisionedThroughputExceeded 오류의 근본 원인을 파악하려면 Amazon CloudWatch로 Amazon Kinesis Data Streams Service를 모니터링하세요.

CloudWatch에서 다음 지표를 검토하세요.

  • GetRecords.Bytes: 지정된 기간 동안 측정한 데이터 스트림에서 검색된 바이트 수입니다.
  • GetRecords.Records: 지정된 기간 동안 데이터 스트림에서 검색된 레코드 수입니다.
  • ReadProvisionedThroughputExceeded: 데이터 스트림에서 제한 중인 GetRecords 호출의 수입니다.

기간을 1분으로 한 상태에서 통계를 합계로 표시하도록 CloudWatch 대시보드를 설정하세요. 그런 다음 합계를 60초로 나누어 평균값을 구합니다.

예를 들어 GetRecords.Records 지표 값을 사용하는 경우 합계를 60초로 나누어 초당 전송된 평균 레코드 수를 계산합니다. 그런 다음 이 평균 값이 데이터 스트림에 설정된 제한의 초당 전송 레코드보다 작은지 확인합니다. 샤드 할당량에 대한 자세한 내용을 보려면 할당량 및 제한을 참조하세요.

참고: 향상된 모니터링 기능을 켜서 로드가 전체 샤드에 균등하게 분산되도록 하세요.

통계를 SampleCount로 보고 기간을 1분으로 설정한 상태에서 GetRecords.Records 지표를 사용할 수도 있습니다. SampleCount 값을 60초로 나누어 각 샤드에 대해 초당 이루어진 평균 GetRecords 호출 수를 계산합니다. 평균값이 초당 약 5회의 GetRecords 호출이고 ReadProvisionedThroughputExceeded 오류가 발생하면 소비자 및 샤드 할당량을 검토하세요. 소비자가 샤드 제한을 초과하지 않는 경우, 소비자가 초당 5회 이상의 GetRecords 호출을 수행하기 때문에 ReadProvisionedThroughputExceeded 오류가 발생할 수 있습니다.

마지막으로, 샤드의 ReadProvisionedThroughputExceeded 값에 차이가 있는지 확인합니다. 샤드의 분포가 고르지 않거나 한 샤드가 다른 샤드보다 많거나 적은 데이터를 수신하는 경우 분포 불균형이 발생할 수 있습니다. 이러한 샤드 분포 불균형을 해결하고 핫 샤드를 방지하려면 putRecords API 직접 호출에서 UUID를 파티션 키로 사용하세요.

발생 가능한 마이크로버스트 식별

드문 경우이긴 하지만 지표 값이 샤드 할당량보다 낮을 수 있으며 이로 인해 읽기 중에 데이터 스트림이 제한될 수 있습니다.

예를 들어 GetRecords.Bytes Sum:1min은 1분 동안 읽은 10MiB의 데이터를 나타냅니다. 1초에 GetRecords.Bytes 호출은 제한 없이 2MiB의 데이터를 읽습니다. 그런 다음 2초에 GetRecords.Bytes 호출이 8MiB의 데이터를 읽습니다. 3초에 읽기 작업이나 제한이 발생하지 않을 수 있습니다. 분당 샤드 할당량(2MiB * 60 = 120MiB의 데이터)에 도달하지는 못했음에도 ReadProvisionedThroughputExceeded 오류가 발생할 수 있습니다. 지표 값이 갑자기 급증하는 것을 발견하면 ReadProvisionedThroughputExceeded 예외를 발생시키는 마이크로버스트를 찾아보세요.

Kinesis Data Streams 모범 사례 따르기

ReadProvisionedThroughputExceeded 예외를 줄이려면 다음 모범 사례를 따르세요.

  • 스트림을 리샤딩하여 스트림의 샤드 수를 늘리세요.
  • GetRecords 요청의 크기를 줄이세요. 제한 파라미터를 구성하거나 GetRecords 요청의 빈도를 줄이세요.
    참고: 소비자가 Amazon Kinesis Data Firehose인 경우 GetRecords 호출의 빈도에 따라 데이터 스트림이 조정됩니다. 소비자가 이벤트 소스 매핑이 있는 AWS Lambda 함수인 경우, 스트림은 1초에 한 번씩 폴링됩니다. 폴링 빈도는 수정할 수 없습니다. 소비자가 Amazon Kinesis Client Library(KCL) 애플리케이션인 경우 폴링 빈도를 조정하세요. 폴링 빈도를 조정하려면 KinesisClientLibConfiguration 파일에서 DEFAULT_IDLETIME_BETWEEN_READS_MILLIS 파라미터 값을 수정하세요. 코드에서 이 값을 동적으로 설정할 수 있습니다. KCL에서 이 값을 수정하는 방법에 대한 자세한 내용을 보려면 GitHub 웹 사이트의 amazon-kinesis-client를 참조하세요.
  • 읽기 및 쓰기 작업을 Data Streams의 모든 샤드에 최대한 균등하게 분배합니다.
  • 데이터 스트림에서 다섯 명 이상의 소비자를 사용되는 경우 향상된 팬아웃 소비자를 사용하세요. 
  • ReadProvisionedThroughputExceeded 예외가 발생하는 경우 소비자 로직에서 오류 재시도 및 지수 백오프 메커니즘을 사용하세요. AWS SDK를 사용하는 소비자 애플리케이션의 경우 요청이 기본적으로 재시도됩니다.
AWS 공식
AWS 공식업데이트됨 일 년 전