분산 시스템에서 "메시지가 정확히 한 번 전달된다"는 보장은 사실상 환상에 가깝다. 네트워크는 끊기고, 노드는 죽고, 응답은 유실된다. 프로듀서가 메시지를 보냈는데 응답(ACK)을 못 받으면, 그 메시지가 도착했는지 안 했는지 알 수 없다. 다시 보내면 중복이 생기고, 안 보내면 유실된다. 이 딜레마가 데이터 수집 신뢰성의 출발점이다.
현실적인 분산 시스템은 대부분 **At-least-once(최소 한 번)**를 보장한다. "유실보다는 중복이 낫다"는 선택이다. 그렇다면 중복을 누가 처리할 것인가? 답은 컨슈머가 멱등성(idempotency)을 갖추는 것이다. 오늘은 이 신뢰성을 구성하는 다섯 개의 축 — 멱등성, 순서, 재시도, 중복 제거, DLQ — 을 다룬다.
| 보장 | 의미 | 비용/복잡도 | 대표 |
|---|---|---|---|
| At-most-once | 최대 한 번, 유실 가능 | 가장 단순 | 재시도 없는 UDP 류 |
| At-least-once | 최소 한 번, 중복 가능 | 중간 | SQS Standard, Kinesis |
| Exactly-once | 정확히 한 번 | 가장 비쌈 | SQS FIFO(범위 한정), Flink(상태) |
진정한 end-to-end exactly-once는 매우 비싸고, 보통 "at-least-once 전달 + 멱등한 컨슈머"의 조합으로 같은 효과를 낸다