이벤트를 재생할 때 중복 처리 없이 복구하는 법
이벤트 처리 오류를 고치기 위해 지난 메시지를 다시 재생할 때, 같은 주문이나 설비 상태 변경이 두 번 반영되면 복구가 새 장애가 됩니다. 재생은 단순한 ‘다시 읽기’가 아니라 부작용을 통제하는 운영 절차입니다.
재생 범위를 사건 기준으로 자른다
오류가 난 기간과 토픽·파티션, 관련 고객이나 설비를 확인합니다. 전체 로그를 무작정 되감으면 이미 정상 처리된 이벤트까지 다시 들어옵니다. 시작·끝 위치와 예상 건수를 기록해야 합니다. 복구 대상을 정할 때는 이벤트가 입력된 시각뿐 아니라 실제 업무 상태가 바뀐 시각도 비교합니다. 재생 범위 밖에서 관련 주문이 수정됐다면 그 변경과 충돌할 수 있으므로 현재 상태를 먼저 점검해야 합니다.
상태 변경을 멱등하게 만든다
이벤트 ID나 업무 키로 이미 적용된 변경을 구분합니다. 소비자 오프셋만 믿으면 데이터베이스 반영 직후 오프셋 기록에 실패했을 때 중복 실행을 막을 수 없습니다.
외부 부작용을 분리한다
상태 재구축에는 과거 이벤트가 필요하지만 이메일 발송이나 결제 호출까지 다시 실행해서는 안 됩니다. 재생 모드에서 외부 호출을 차단하거나 안전한 대체 경로를 사용합니다.
순서와 스키마를 확인한다
과거 이벤트의 스키마가 현재 코드와 다를 수 있고, 관련 이벤트의 순서가 중요할 수도 있습니다. 변환 규칙을 버전별로 적용하고 재생 전후의 건수·합계·최종 상태를 비교합니다.
작은 범위에서 먼저 시험한다
프로덕션에 적용하기 전 격리된 환경에서 재생해 예상 상태와 차이를 확인합니다. 실제 재생 중에는 처리량을 제한하고 중단·재개 지점을 남기며 담당자가 결과를 승인하게 합니다.
현장에 적용할 때의 순서
- 오류 범위와 재생 오프셋 확정
- 멱등 처리와 외부 부작용 차단
- 격리 환경 시험 후 상태 합계 비교
주의할 실패: 오프셋만 되돌리면 안전하게 복구된다고 믿음
관찰할 지표: 중복 적용 0건·재생 전후 상태 차이
적용 전 체크리스트
- 재생 시작·끝 위치와 예상 건수를 기록한다
- 외부 발송·결제 호출의 재실행을 차단한다
- 재생 전후 상태와 합계를 대조한다
참고 자료
Confluent Documentation — Kafka Consumer. 소비자 오프셋과 재소비의 동작은 Confluent 공식 Kafka 문서를 참고했습니다. 외부 부작용 차단은 애플리케이션 운영 제안입니다.
이미지와 도식은 이해를 돕기 위한 개념 시각화입니다. 특정 고객의 실제 설비·데이터·화면을 재현한 것이 아닙니다.
#이벤트재생 #Kafka #멱등성 #데이터복구 #이벤트스트림 #오프셋 #분산시스템 #장애복구 #스키마버전 #운영
이 주제를 실제 시스템으로 옮기려면 AI 알고리즘 개발 살펴보기