피드로 돌아가기
Shopify Idempotency Strategies: A Developer's Survival Guide
Dev.toDev.to
Backend

Idempotency Key와 DB 제약조건을 통한 중복 결제 및 주문 방지 설계

Shopify Idempotency Strategies: A Developer's Survival Guide

Muhammad Masad Ashraf2026년 5월 5일4intermediate

Context

네트워크 불안정으로 인한 브라우저 재시도 및 Shopify Webhook의 At-least-once 전달 특성에 따른 데이터 중복 생성 위험 존재. 단순 애플리케이션 레벨의 체크만으로는 Race Condition 발생 시 중복 처리를 완전히 차단하지 못하는 한계점 확인.

Technical Solution

  • REST API 호출 시 UUID v4 기반 Idempotency-Key 헤더를 도입하여 동일 비즈니스 이벤트의 중복 실행 방지
  • X-Shopify-Webhook-Id를 Redis Key로 활용하고 48시간 TTL을 설정하여 Webhook 중복 처리 차단
  • 처리 실패 시 재시도 루프 내 Exponential Backoff와 Jitter를 적용하여 Thundering Herd 문제 해결
  • PostgreSQL Unique Index를 최종 방어선으로 구축하여 동시성 요청에 의한 Race Condition 원천 봉쇄
  • GraphQL API의 헤더 부재를 해결하기 위해 Create 대신 Upsert 패턴의 Mutation 설계 적용
  • Webhook 처리 전 Redis에 상태를 먼저 기록함으로써 처리 중 실패 시 재시도 가능성을 보장하는 순서 설계

1. REST API 요청 시 Idempotency Key를 생성하고 요청 전 저장했는가?

2. Webhook 처리 로직에서 X-Shopify-Webhook-Id 기반의 중복 제거 저장소가 존재하는가?

3. 분산 환경의 Race Condition 방지를 위해 DB 수준의 Unique Constraint가 설정되었는가?

4. API 재시도 로직에 지수 백오프와 지터(Jitter)가 포함되어 서버 부하를 분산하고 있는가?

5. GraphQL 사용 시 단순 생성보다는 Upsert 기반의 멱등성 설계가 적용되었는가?

원문 읽기