피드로 돌아가기
"Why Your Retry Logic Is Silently Charging Customers Twice"
Dev.toDev.to
Backend

Idempotency-Key 기반 중복 결제 방지 및 Thundering Herd 해결 설계

"Why Your Retry Logic Is Silently Charging Customers Twice"

Maksat Ramazan2026년 5월 12일8intermediate

Context

네트워크 지연으로 인한 클라이언트의 반복 요청이 서버 측 중복 처리로 이어져 결제 오류가 발생하는 문제 발생. 단순 멱등성 구현 시 발생하는 동시성 제어 실패와 잘못된 응답 캐싱으로 인한 시스템 불안정성 해결 필요.

Technical Solution

  • Idempotency-Key 헤더 도입을 통한 요청 고유 식별 및 응답 캐싱 구조 설계
  • Per-key Lock 메커니즘을 적용하여 동일 키의 동시 요청 시 단일 핸들러만 실행하는 Thundering Herd 방지
  • Lock 획득 직후 재검증하는 Double-check 패턴을 적용하여 대기 중인 요청의 중복 실행 차단
  • 200, 201, 204 등 성공 상태 코드만 선택적 캐싱하여 일시적 500 에러의 영구 캐싱 문제 해결
  • 요청 바디의 해시 값을 비교하여 동일 키에 다른 데이터가 전송된 경우 422 Unprocessable Entity 응답 처리
  • 처리 중인 요청에 대한 즉각적인 409 Conflict 반환으로 클라이언트의 불필요한 대기 및 리소스 낭비 방지

- 결제 등 상태 변경 API 설계 시 Idempotency-Key 헤더 필수 검토 - 동시 요청 처리를 위해 분산 락(Redis SET NX 등)과 Double-check 로직 구현 여부 확인 - 에러 응답의 캐싱 여부를 설정 가능하게 설계하여 복구 가능성 확보 - 동일 키-다른 바디 요청에 대한 유효성 검증 로직 포함 여부 체크

원문 읽기