정확히 한 번 의미론 (exactly-once semantics)
쉽게 풀면
메시지를 주고받는 시스템에서는 응답이 사라지면 보낸 쪽이 다시 보내게 되어 같은 처리가 두 번 일어날 수 있습니다. 정확히 한 번 의미론은 그런 재시도가 있더라도 최종 결과에는 한 번만 반영되도록 만드는 것입니다. 실제로는 전송을 한 번만 하는 것이 아니라, 중복된 처리의 효과를 지워 결과를 한 번처럼 만드는 방식입니다.
왜 중요한가
결제나 재고처럼 중복 처리가 곧 금전적 손해로 이어지는 업무에서는 필수 요구사항입니다. 분산 시스템에서 무엇이 보장 가능하고 무엇이 불가능한지를 이해하는 관문이기도 합니다. 주요 스트림 처리 플랫폼들이 이 보장을 제공한다고 내세우기 때문에, 그 조건과 한계를 정확히 아는 것이 시스템 설계자의 기본 소양이 되었습니다.
논문에서는 이렇게 쓰입니다
어디까지 읽었는지 기록하는 일과 결과를 쓰는 일을 한 묶음으로 처리해 중복을 없앴다는 뜻입니다.
조금 더 깊게 보면
구현은 대체로 두 가지 축으로 이루어집니다. 하나는 각 메시지에 고유 식별자와 일련번호를 붙여 수신 측이 중복을 걸러 내는 멱등성 확보이고, 다른 하나는 상태 갱신과 출력 기록, 진행 위치 커밋을 하나의 원자적 트랜잭션으로 묶는 것입니다. 상태를 주기적으로 스냅숏으로 남기고 장애 시 그 지점으로 되감는 방식이 널리 쓰입니다. 부수효과가 외부 시스템으로 나가는 경우에는 그 시스템도 트랜잭션이나 멱등 쓰기를 지원해야만 보장이 성립합니다.
주의할 점
메시지가 네트워크에 물리적으로 한 번만 흐른다는 뜻이 아니라, 관찰 가능한 효과가 한 번이라는 뜻입니다. 시스템 경계를 넘어가는 순간 보장이 깨지기 쉬우므로 최소 한 번 전달과 멱등성 조합으로 대신 설계하는 경우가 실무에서는 더 흔합니다.