피드로 돌아가기
Dev.toBackend
원문 읽기
Stripe 방식의 Idempotency-Key 처리를 통한 중복 결제 방지 및 Exactly-once 실행 보장
How I built a Go middleware for Stripe-style idempotency-key handling
AI 요약
Context
결제 및 주문 API에서 클라이언트 타임아웃으로 인한 재시도 시 중복 과금이 발생하는 문제 발생. 단순한 Redis SETNX 기반의 Lock 구조는 동시성 요청 처리 실패, 핸들러 Panic 시 Lock 해제 불가, 페이로드 변경 시 데이터 불일치라는 세 가지 결정적 한계를 가짐.
Technical Solution
- IETF Idempotency-Key 드래프트 표준 및 Stripe 시맨틱을 준수하는 net/http 미들웨어 설계
- 스토리지 계층의 원자적 연산을 통해 Exactly-once 실행 보장(In-memory Mutex, Redis Lua Script, Postgres ON CONFLICT 활용)
- 요청 처리 상태에 따른 정교한 응답 제어(신규 요청 시 핸들러 실행 및 응답 저장, 동일 키 재요청 시 저장된 응답 Replay, 처리 중 요청 시 409 Conflict 반환)
- 페이로드 무결성 검증 로직을 통한 동일 키 내 데이터 변경 시 422 Unprocessable Entity 응답 처리
- Store 인터페이스(Claim, Complete, Abandon) 추상화를 통한 인메모리, Redis, Postgres 등 플러그형 백엔드 지원
- 리소스 고갈 방지를 위해 처리 중인 요청에 대해 대기하지 않고 즉시 409 에러를 반환하여 재시도 책임을 클라이언트로 위임
실천 포인트
1. Idempotency-Key 도입 시 단순 Lock이 아닌 응답값 저장 및 Replay 구조인지 확인
2. 동시 요청 발생 시 서버 측 대기(Blocking)보다 409 Conflict 반환을 통한 리소스 보호 검토
3. 동일 키로 다른 페이로드가 전송되는 엣지 케이스에 대한 Validation 로직 포함 여부 점검
4. 스토리지 계층에서 원자적 연산(Atomic Operation)을 통해 Race Condition을 원천 차단했는지 확인