이번 기사에서는 Kinesis Streams에서의 Thrrotling 발생 시 발생 원인을 파악하고 해결하는 방법을 알려드립니다.
Kinesis Streams에서 쓰로틀링이 발생하는 원인
일반적으로 프로비저닝 모드의 Kinesis 스트림은 샤드 수에 따라 최대 처리량이 결정됩니다.
각 샤드는 최대 1MB/s 또는 1,000레코드/초의 쓰기 처리량, 그리고 최대 2MB/s 또는 2,000레코드/초의 읽기 처리량을 지원합니다.
이러한 제한을 초과하면 읽기 쓰로틀링 및 쓰기 쓰로틀링이 발생할 수 있습니다.
[+] 할당량 및 제한 - https://docs.aws.amazon.com/ko_kr/streams/latest/d
이번 기사에서는 쓰로틀링 발생 시 발생 원인을 파악하고 해결하는 방법을 알려드립니다. [1]
쓰로틀링 문제를 해결하면 Kinesis 스트림의 안정적인 운영과 성능 향상에 도움이 됩니다.
WriteProvisionedThroughputExceeded
프로비저닝 모드의 Kinesis 스트림에서 각 샤드는 최대 1MB/s 또는 1,000레코드/초의 쓰기 처리량을 지원합니다.
WriteProvisionedThroughputExceeded 예외가 발생한다면, 이는 데이터 스트림에 할당된 쓰기 처리량 한도를 초과했음을 의미합니다.
모니터링 지표
WriteProvisionedThroughputExceeded 예외 발생 원인을 파악하기 위해서는 해당 시점의 IncomingBytes와 IncomingRecords 지표를 활용할 수 있습니다.
이 지표들의 1분 단위 SUM 값을 구한 후, 60으로 나누면 해당 기간 동안의 1초당 평균 처리량을 확인할 수 있습니다.
이 값이 서비스 할당량을 초과했다면 WriteProvisionedThroughputExceeded 예외가 발생한 원인이 될 수 있습니다.
[+] Kinesis Data Streams이 스트롤링되는 이유는 무엇인가요?
https://repost.aws/ko/knowledge-center/kinesis-data-stream-throttling
1분 데이터 포인트에서 값을 가져와 60으로 나눌 수도 있습니다. 이렇게 하면 특정 기간 내에 스로틀링이 발생하는지 여부를 판단하는 데 도움이 되는 초당 평균값을 얻을 수 있습니다.
성공 횟수가 할당량을 초과하지 않으면 IncomingRecords 지표를 WriteProvisionedThroughputExceeded 메트릭에 추가하고 계산을 다시 시도합니다.
IncomingRecords 지표는 성공 또는 수락된 레코드를 나타냅니다. WriteProvisionedThroughputExceeded 지표는 스로틀링된 레코드 수를 나타냅니다.
- IncomingBytes : 지정한 기간 동안 Kinesis 스트림에 성공적으로 입력된 바이트 수입니다
- IncomingRecords : 지정한 기간 동안 Kinesis 스트림에 성공적으로 입력된 레코드 수입니다.
해결 방안
- 핫 샤드 확인: 특정 샤드에 레코드가 집중되어 처리량 제한을 초과할 수 있습니다. 향상된 모니터링을 활성화하여 핫 샤드 발생 여부를 확인하세요.
- 랜덤 파티션 키 사용: 레코드를 균등하게 분산시키기 위해 임의의 파티션 키를 사용하세요. 이미 랜덤 키를 사용 중이라면 키 생성 방식을 조정하여 분산을 개선하세요.
- 샤드 수 증가: 샤드 포화도에 따라 스트림의 샤드 수를 늘려 전체 처리량을 높일 수 있습니다.
ReadProvisionedThroughputExceeded
프로비저닝 모드의 Kinesis 스트림에서 각 샤드는 최대 2MB/s 또는 2,000레코드/초의 읽기 처리량을 지원합니다.
ReadProvisionedThroughputExceeded 지표는 GetRecords 호출이 Kinesis 서비스 또는 샤드의 할당된 읽기 처리량 한도를 초과하여 스로틀링된 호출 수를 나타냅니다.
이 지표 값이 0이 아닌 경우, 읽기 처리량 제한을 초과하고 있음을 의미합니다.
적절한 모니터링을 통해 ReadProvisionedThroughputExceeded 지표를 주시하고, 필요에 따라 샤드 수를 조정하여 충분한 읽기 처리량을 확보해야 합니다.
모니터링 지표
ReadProvisionedThroughputExceeded 예외 발생 원인을 파악하기 위해서는 해당 시점의 GetRecords.Records와 GetRecords.Bytes 지표를 활용할 수 있습니다.
이 지표들의 1분 단위 SUM 값을 구한 후, 60으로 나누면 해당 기간 동안의 초당 평균 읽기 처리량을 확인할 수 있습니다.
이 값이 서비스 할당량을 초과했다면 ReadProvisionedThroughputExceeded 예외가 발생한 원인을 찾을 수 있습니다.
적절한 모니터링과 분석을 통해 Kinesis 스트림의 읽기 처리량 문제를 효과적으로 해결할 수 있습니다.
[+] Kinesis Data Streams에서 ReadProvisionedThroughputExceeded 예외를 감지하고 문제를 해결하려면 어떻게 해야 하나요?
https://repost.aws/ko/knowledge-center/kinesis-readprovisionedthroughputexceeded
GetRecords.Records 지표 값을 사용하는 경우 합계를 60초로 나누어 초당 전송된 평균 레코드 수를 계산합니다.
그런 다음 이 평균 값이 데이터 스트림에 설정된 제한의 초당 전송 레코드보다 작은지 확인합니다.
- GetRecords.Bytes: 지정된 기간 동안 측정한 데이터 스트림에서 검색된 바이트 수입니다.
- GetRecords.Records: 지정된 기간 동안 데이터 스트림에서 검색된 레코드 수입니다.
해결 방안
- 스트림 리샤딩 : 스트림을 리샤딩하여 스트림의 샤드 수를 늘리세요.
- GetRecords 요청 크기 조정: GetRecords 요청의 크기를 줄이거나 요청 빈도를 낮춰 읽기 처리량 부하를 줄입니다.
- 향상된 팬아웃 사용: 데이터 크기는 동일하지만 소비자 증가로 인한 처리량 요구사항 증가 시, 소비자별 독립적인 읽기 할당량을 제공하는 향상된 팬아웃 기능을 사용합니다. [2]
- 지수 백오프 메커니즘 사용 : 소비자 애플리케이션에서 오류 재시도 및 지수 백오프 메커니즘을 구현하여 스로틀링 발생 시 재시도 전략을 적용합니다. AWS SDK를 사용하는 경우 기본적으로 재시도가 이루어집니다.
참고 자료
[1] Kinesis Data Streams 문제를 모니터링하고 해결하는 데 사용할 수 있는 지표는 무엇인가요?
https://repost.aws/ko/knowledge-center/kinesis-data-streams-troubleshoot
[2] 아마존 Kinesis Data Streams에서 데이터 읽기- 향상된 팬아웃이 있는 등록 소비자
https://docs.aws.amazon.com/ko_kr/streams/latest/dev/building-consumers.html