피드로 돌아가기
올리브영 테크블로그Backend
원문 읽기
Kafka 메시지 중복 및 유실 케이스별 해결 방법
올리브영 SCM 스쿼드가 Kafka 멱등성 설정과 Consumer Graceful Shutdown을 통해 메시지 중복·유실 없는 OMS 시스템 구축
AI 요약
Context
올리브영의 기존 WMS 연동 시스템은 40개의 EAI와 배치 작업으로 운영되었으며, 실시간 물류 데이터 송수신이 불가능했다. 대한통운과의 협력사 데이터까지 인터페이싱해야 하는 OMS 프로젝트에서는 메시지 중복 및 유실 방지가 필수 요구사항이었다.
Technical Solution
- Producer 레벨 메시지 유실 방지:
acks=all옵션으로 Leader와 Follower 모두의 응답 확인 후 전송 완료 처리 - Producer 중복 전송 방지:
enable.idempotence=true로 설정해 Produce ID와 시퀀스 번호 기반 중복 제거 (max.in.flight.requests.per.connection ≤ 5, retries ≥ 1 함께 설정) - Consumer 서버 재기동 시 메시지 유실 방지:
auto.offset.reset=earliest,spring.kafka.listener.immediate-stop=false(Graceful Shutdown) 적용 - Consumer 중복 Consume 방지:
AcksMode=MANUAL_IMMEDIATE로 acknowledge 메서드 호출 직후 즉시 커밋, 병렬 처리 시간이max.poll.interval.ms초과하지 않도록 모니터링 - Partition 재할당 전략: CooperativeSticky Strategy 도입으로 Consumer Rebalancing 중 불필요한 파티션 정지 최소화
- DLQ 자동 백업: AWS Kinesis Data Firehose로 5분 또는 5MiB 간격으로 GZIP 압축해 S3에 백업, AWS Lambda로 JSON을 Excel로 변환해 관리
Impact
- 기존 40개 EAI 및 배치 작업 제거, Kafka Topic 30개로 통합
- 처리량 성능 3배에서 최대 45배 증가
- 2024년 8월 11일 전면 오픈 후 2024년 11월까지 안정적 운영
Key Takeaway
Kafka 기반 실시간 메시지 처리 시스템에서 Exactly-once 보장은 Producer의 멱등성 설정, Consumer의 수동 Offset 커밋과 Graceful Shutdown 조합으로 달성 가능하며, DLQ 패턴과 자동 백업으로 오류 데이터를 체계적으로 관리할 수 있다.
실천 포인트
AWS MSK 기반 Kafka 시스템을 운영하는 팀은 Kafka 2.x를 사용할 경우 `acks=all`, `enable.idempotence=true`, `AcksMode=MANUAL_IMMEDIATE`, Graceful Shutdown을 필수로 설정해야 Consumer Rebalancing 중 메시지 중복 없이 Exactly-once 보장을 구현할 수 있으며, max.poll.interval.ms를 초과하는 로직은 사전에 성능 테스트로 식별해야 한다.