중복 레코드 처리 - Amazon Kinesis Data Streams

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

중복 레코드 처리

Amazon Kinesis Data Streams 애플리케이션에 레코드가 두 번 이상 전송되는 두 가지 주된 이유는 생산자 재시도 및 소비자 재시도입니다. 애플리케이션은 개별 레코드가 여러 번 처리될 것을 예상하고 이 문제를 적절하게 처리해야 합니다.

생산자 재시도

PutRecord를 직접적으로 호출한 후 Amazon Kinesis Data Streams에서 승인을 받기 전에 생산자에서 네트워크 관련 시간 초과가 발생한다고 생각해 보세요. 생산자는 레코드가 Kinesis Data Streams에 전송되었는지 확실히 알 수 없습니다. 모든 레코드가 애플리케이션에 중요하다는 가정하에, 동일한 데이터로 호출을 재시도하도록 생산자가 작성되었습니다. 동일한 데이터에 대한 2개의 PutRecord 호출이 모두 성공적으로 Kinesis Data Streams에 커밋되면 Kinesis Data Streams 레코드 2개가 생깁니다. 두 레코드의 데이터가 같아도 시퀀스 번호는 고유합니다. 중복을 철저히 방지해야 하는 애플리케이션은 처리할 때 중복 항목을 제거하기 위해 레코드에 기본 키를 포함해야 합니다. 생산자 재시도로 인한 중복 수는 대개 소비자 재시도로 인한 중복 수보다 적습니다.

참고

AWS SDK PutRecord를 사용하는 경우 기본 구성이 실패한 PutRecord 호출을 3회까지 재시도합니다.

소비자 재시도

레코드 프로세서가 다시 시작될 때 소비자(데이터 처리 애플리케이션) 재시도가 발생합니다. 다음과 같은 경우 동일한 샤드의 레코드 프로세서가 다시 시작됩니다.

  1. 작업자가 예기치 않게 종료된 경우

  2. 작업자 인스턴스가 추가 또는 제거된 경우

  3. 샤드가 병합 또는 분할된 경우

  4. 애플리케이션이 배포된 경우

이 모든 경우에 샤드-작업자-레코드 프로세서 간의 매핑이 로드 밸런싱 처리로 계속 업데이트됩니다. 다른 인스턴스로 마이그레이션된 샤드 프로세서가 마지막 체크포인트에서 레코드 처리를 다시 시작합니다. 그 결과 아래의 예와 같이 중복된 레코드가 처리됩니다. 로드 밸런싱에 대한 자세한 내용은 리샤딩, 크기 조정 및 병렬 처리를 참조하십시오.

예: 다시 전달된 레코드로 인한 소비자 재시도

이 예에서 애플리케이션이 스트림에서 지속적으로 레코드를 읽고 로컬 파일로 레코드를 집계하며 파일을 Amazon S3에 업로드합니다. 간단한 설명을 위해 샤드 1개와 샤드를 처리하는 작업자 1개가 있다고 가정해 보겠습니다. 마지막 체크포인트가 레코드 번호 10000에 있다는 가정하에 다음의 이벤트 시퀀스 예를 살펴보십시오.

  1. 작업자가 샤드에서 다음 레코드 배치(레코드 10001부터 20000까지)를 읽습니다.

  2. 그런 다음 작업자가 레코드 배치를 연결된 레코드 프로세서로 전달합니다.

  3. 레코드 프로세서가 데이터를 집계하고 Amazon S3 파일을 생성하며 파일을 Amazon S3에 성공적으로 업로드합니다.

  4. 새로운 체크포인트가 발생하기 전에 작업자가 예기치 않게 종료됩니다.

  5. 애플리케이션, 작업자 및 레코드 프로세서가 다시 시작됩니다.

  6. 이제 작업자가 마지막으로 성공한 체크포인트(여기서는 10001)에서 읽기 시작합니다.

따라서 레코드 10001 ~ 20000이 두 번 이상 소비됩니다.

소비자 재시도에 대한 복원

레코드가 두 번 이상 처리되더라도 한 번만 처리된 것처럼 보이는 부작용이 애플리케이션에 발생할 수 있습니다(idempotent 처리). 이 문제의 해결 방법은 복잡성과 정확도에 따라 다릅니다. 최종 데이터의 대상이 중복 항목을 잘 처리할 수 있으면 최종 대상을 통해 idempotent 처리를 수행하는 것이 좋습니다. 예를 들어, Opensearch를 통해 버전 관리와 고유 ID를 함께 사용하여 중복 처리를 방지할 수 있습니다.

이전 섹션의 예제 애플리케이션은 스트림에서 계속 레코드를 읽고 로컬 파일로 레코드를 집계하며 파일을 Amazon S3에 업로드합니다. 설명한 대로 레코드 10001~20000이 두 번 이상 소비되어 데이터가 동일한 Amazon S3 파일이 여러 개 생깁니다. 이 예에서 중복을 완화하는 한 가지 방법은 3단계에서 다음 방법을 사용하는 것입니다.

  1. 레코드 프로세서가 Amazon S3 파일마다 일정한 수(예: 5000)의 레코드를 사용합니다.

  2. 파일 이름에는 Amazon S3 접두사, 샤드 ID 및 First-Sequence-Num이라는 스키마가 사용됩니다. 이 경우에는 sample-shard000001-10001과 같은 이름일 수 있습니다.

  3. Amazon S3 파일을 업로드한 후 Last-Sequence-Num을 지정하여 체크포인트를 수행합니다. 이 경우 레코드 번호 15000에서 검사합니다.

이 방법을 사용하면 레코드가 두 번 이상 처리되더라도 Amazon S3 파일의 이름과 데이터가 동일합니다. 재시도가 발생하면 반드시 동일한 데이터가 두 번 이상 같은 파일에 쓰여집니다.

리샤딩 작업에서는 샤드에 남은 레코드 수가 필요한 일정한 수보다 적을 수 있습니다. 이 경우 shutdown() 메서드가 Amazon S3 및 마지막 시퀀스 번호의 체크포인트로 파일을 플러시해야 합니다. 위의 방법은 리샤딩 작업에도 적용됩니다.