**exactly-once 의미론(EOS)**은 실패와 재시도가 있어도 각 메시지가 정확히 한 번 처리되도록 보장합니다 — 유실 없음, 중복 없음. Kafka는 멱등 producer와 트랜잭션을 통해 이를 달성하지만, 복잡하고 오버헤드가 있습니다.
과제
exactly-once는 분산 시스템에서 어려움(실패, 재시도, 중복이 불가피):
→ producer 재시도 → 중복 메시지; consumer 재처리 → 중복 효과
→ 순진한 at-least-once → 중복; at-most-once → 유실
→ exactly-once는 유실과 중복을 둘 다 피하기 위해 신중한 메커니즘이 필요.
Kafka가 exactly-once를 달성하는 방식
1. 멱등 PRODUCER(enable.idempotence=true):
→ producer가 재시도를 중복 제거(partition별 시퀀스 번호) → 재시도로 같은 메시지를
두 번 보내도 한 번만 기록(재시도로 인한 중복 없음)
2. 트랜잭션:
→ 쓰기(와 consumer offset commit)를 원자적 트랜잭션으로 묶음 → 모두 성공 또는 롤백
→ "consume-process-produce"를 원자적으로: 읽기, 처리, 결과 쓰기 + offset commit을
함께 → 파이프라인 전반의 exactly-once(Kafka 내)
→ Kafka Streams는 종단 간 exactly-once 처리에 이를 사용
