메시지가 유실될 수는 있지만, 중복되지는 않는 방식
메시지가 절대 유실되지는 않지만, 중복될 수 있는 방식이다. Kafka의 기본 동작 방식이기도 하다
메시지가 유실되지도 않고 중복되지도 않는 가장 이상적인 방식이다.
| 방식 | 유실 가능성 | 중복 가능성 | 난이도 / 비용 | 주요 설정 예시 |
|---|---|---|---|---|
| At-most-once | 있음 | 없음 | 낮음 | acks=0, enable.auto.commit=true |
| At-least-once | 없음 | 있음 | 보통 | acks=all, retries > 0 |
| Exactly-once | 없음 | 없음 | 높음 | enable.idempotence=true, isolation.level=read_committed |
실무를 할 때에는 보통 At-least-once를 기본 전략으로 가져가되, 애플리케이션 계층에서 멱등성을 확보하는 방식이 가장 가성비가 좋다.
Exactly-once는 완벽해 보이지만, 트랜잭션 오버헤드로 인해 처리량이 다소 떨어질 수 있기 때문에 성능 요구사항을 잘 따져보고 적용하는 것을 추천한다.
1. 개별 도메인 기반의 Idempotent Consumer
spinId를 각 도메인 (미션, 포인트) 테이블에 저장해 체크하는 방식이다.spin_id 컬럼과 인덱스가 필요하다.2. 전용 '중복 체크 테이블' 활용 (Dedup Table)
processed_event 테이블을 둔다.3. 더 효율적인 처리 : Redis 기반 필터링
spinId가 있는지 확인 (SETNX 등 사용)4. 아키텍처적 대안 : 상태 기반 처리 (Stateful)
spinId를 일일히 기록하는 대신 시퀀스나 오프셋을 활용할 수도 있다spinId가 순차적으로 증가한다는 보장이 있을 때 매우 효과적이다)