[AWS] Kinesis Steam의 Shard란? 쉽게 정리 (Provisioned Throughput ExceededException이 있을 경우)
Kinesis의 Shard
Amazon Kinesis에서 "Shard"는 데이터 스트림의 기본 단위이다.
"Shard"는 Stream 내에서 데이터의 전송 및 처리의 단위를 제공한다. 그리고 Kinesis에서 데이터를 효율적으로 관리하고 처리하는 데 필수적인 역할을 한다.
- 독립적인 데이터 처리: 각 샤드는 별개의 데이터 스트림을 유지하여 병렬로 데이터를 처리할 수 있다.
- 처리 용량: 각 샤드는 초당 최대 1,000개의 데이터를 쓸 수 있고, 5개의 데이터를 읽을 수 있다. 필요에 따라 샤드를 추가해 처리 능력을 확장할 수 있다.
- 순서 보장: 같은 샤드에 기록된 데이터는 순서를 유지하지만, 다른 샤드 간에는 순서가 보장되지 않는다.
- Shard Iterator: 데이터를 읽기 위해 사용하는 포인터로, 샤드 내에서 특정 데이터에 접근할 수 있게 해준다.
🤔 문제
애플리케이션이 Amazon Kinesis를 사용하여 클릭(Click) 스트림 데이터를 처리하고 있습니다. 이 클릭스트림 데이터는 주기적으로 스파이크(급증)를 겪고 있습니다. PutRecords API 호출이 때때로 실패하며, 로그에는 실패한 호출이 다음과 같은 응답을 반환하는 것으로 나타납니다:
{
"FailedRecordCount": 1,
"Records": [
{
"SequenceNumber": "21269319989900637946712965403778482371",
"ShardId": "shardId-000000000001"
},
{
"ErrorCode": "Provisioned Throughput ExceededException",
"ErrorMessage": "Rate exceeded for shard shardId-000000000001 in stream exampleStreamName under account 123456789."
},
{
"SequenceNumber": "21269319989999637946712965403778482985",
"ShardId": "shardId-000000000002"
}
]
}
이 문제를 완화하는 데 도움이 되는 기술은 무엇인가요? (두 가지를 선택하세요.)
- Exponential backoff를 사용하여 요청을 재시도한다
- PutRecords 대신 PutRecord API를 사용합니다.
- 요청 빈도 (와/또는) 크기를 줄입니다.
- Kinesis 대신 Amazon SNS를 사용합니다.
- KCL 소비자의 수를 줄입니다.
정답 & 오답
정답. 1번, 3번
설명:
로그에는 "Provisioned Throughput ExceededException" 오류가 표시되고 있다.
이는 Kinesis Stream의 Shard가 데이터 처리량 한도를 초과했음을 의미한다. (스트림에 대한 요청 비율이 너무 높거나 데이터가 가용 처리량에 비해 너무 크다)
이 문제를 해결하려면 요청의 속도나 빈도를 줄이거나, 실패한 요청을 다시 시도하는 방법이 필요하다.
참고: https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html
https://repost.aws/knowledge-center/kinesis-data-stream-throttling
1번. Exponential backoff를 사용하여 요청을 재시도한다
Provisioned Throughput ExceededException은 샤드의 처리량 제한을 초과할 때 발생하므로, 실패한 요청을 즉시 다시 시도하기보다는 일정 시간 대기 후 점진적으로 대기 시간을 늘려가며 재시도하는 방식(Exponential backoff)을 사용하면 도움이 된다. 이렇게 하면 급증하는 요청을 완화하고 샤드의 부담을 줄일 수 있다.
3번. 요청 빈도 (와/또는) 크기를 줄입니다.
요청 빈도나 데이터 크기를 줄이면 Kinesis가 과부하 없이 요청을 처리할 수 있어 예외 발생을 줄이는 데 도움이 된다