분산 시스템에서 Timeouts, Retries, Idempotency 다루기
(infoq.com)Sam Newman은 분산 시스템에서 꼭 이해해야 할 3가지 핵심 개념으로 Timeouts(타임아웃), Retries(재시도), **Idempotency(멱등성)**를 강조했다.
Paxos, Raft 같은 복잡한 분산 알고리즘보다 이 기본 개념들을 먼저 정확히 다루는 것이 중요하다고 말했다.
분산 시스템의 세 가지 기본 전제
- 정보는 즉시 전달되지 않는다.
- 상대 시스템이 응답하지 않을 수 있다.
- 리소스는 유한하다.
이 세 가지가 분산 시스템의 모든 복잡성을 만드는 근본 원인이다.
Timeouts (타임아웃)
요청이 일정 시간 안에 완료되지 않으면 중단시켜야 한다.
리소스를 오랫동안 점유하면 시스템 과부하와 사용자 불편이 발생할 수 있다.
Newman은 “타임아웃은 단일 요청의 성공보다 시스템 전체의 건강을 우선하는 것”이라고 설명했다.
중요 포인트
- 평균 실행 시간과 사용자 기대치를 파악
- 설정 값은 코드 수정 없이 유연하게 변경 가능해야 함
Retries (재시도)
과도한 재시도는 시스템에 자해적 DoS 공격이 될 수 있다.
재시도는 필요하되, **클라이언트·서버 단에서의 제한과 네트워크 지터(jitter)**를 함께 고려해야 한다.
Newman은 지터 추가는 좋지만, 지수적 백오프는 오히려 시스템에 부담이 될 수 있다고 경고했다.
Idempotency (멱등성)
요청을 여러 번 보내도 결과가 같아야 한다.
이는 주로 서버 쪽 책임이며, 재시도가 안전하기 위한 전제 조건이다.
실제 시나리오
- 요청이 서버에 도달하지 못한 경우: 아무 일도 없음
- 서버가 처리했지만 응답이 끊긴 경우: 변경은 됐지만 클라이언트는 알지 못함 → 멱등성 필요
구현 방식
- 요청 ID 사용: 클라이언트가 반복된 요청임을 알 수 있도록 식별자 부여
- Fingerprint 방식: 요청 본문의 해시값 등을 기준으로 중복 여부 판단 (시간 정보는 지양)
결론
"같은 행동을 반복하며 다른 결과를 기대하는 건 광기"라는 말을 인용하며 시작했지만,
Newman은 분산 시스템에서는 재시도가 오히려 합리적일 수 있다고 말했다.
단, 재시도는 반드시 안전하게 이루어져야 하며, 이를 위해 타임아웃과 멱등성이 함께 설계되어야 한다고 강조했다.