Kafka는 메시지가 유실되거나 중복될 수 있는지를 결정하는 다양한 전달 보장(at-most-once, at-least-once, exactly-once)을 지원합니다. 이를 이해하고 어떻게 달성하는지 아는 것은 안정적인 시스템 구축에 중요합니다.
세 가지 전달 의미론
AT-MOST-ONCE → 메시지가 유실될 수 있지만 절대 중복되지 않음:
→ 처리 전 offset commit → 처리 실패 시 메시지를 건너뜀(유실)
→ 가끔의 유실이 허용되고 중복이 안 될 때(드묾)
AT-LEAST-ONCE → 메시지가 절대 유실되지 않지만 중복될 수 있음:
→ 처리 후 offset commit → commit 전 크래시 시 메시지 재처리(중복) → 멱등 처리 필요
→ 흔한 기본값; 안전(유실 없음)하지만 중복 처리 필요
EXACTLY-ONCE → 각 메시지가 정확히 한 번 처리됨(유실 없음, 중복 없음):
→ 가장 강력하지만 가장 어려움; Kafka 트랜잭션 + 멱등 producer 필요
보장 달성하기
→ AT-LEAST-ONCE → 처리 후 commit; consumer를 멱등하게(dedup key, 멱등 연산으로
중복을 안전하게 처리) — 실용적이고 흔함
→ EXACTLY-ONCE → Kafka 트랜잭션 API + 멱등 producer(enable.idempotence) →
produce + offset commit을 원자적으로(Kafka 내 exactly-once, 예: Kafka Streams)
⚠️ exactly-once는 복잡하고 오버헤드가 있음 → 종종 AT-LEAST-ONCE + 멱등성이 더 단순하고 충분
