피드로 돌아가기
Dev.toBackend
원문 읽기
Queue 기반 비동기 처리로 Webhook 중복 결제 제로화 및 가용성 확보
How I Handle Stripe Webhooks in Production (The Right Way)
AI 요약
Context
동기적 처리 방식의 Webhook 핸들러는 DB 트랜잭션 실패나 외부 API 지연 시 Stripe의 재시도 메커니즘으로 인한 중복 처리 위험이 존재함. 특히 처리 시간이 30초를 초과할 경우 타임아웃으로 인한 무한 재시도와 데이터 부정합이 발생하는 구조적 한계가 있음.
Technical Solution
- 'Receive Fast, Process Safe' 전략을 통한 수신과 처리의 물리적 분리 설계
- Stripe Event ID를 Primary Key로 설정한 Events Table 기반의 Natural Deduplication 구현
onConflictDoNothing구문을 통한 중복 이벤트의 원천 차단 및 Idempotency 보장- 서명 검증 후 즉시 DB 저장 및 200 OK 응답을 반환하여 Stripe 타임아웃 리스크 제거
- Background Worker를 통한 비동기 큐 처리와 에러 컬럼 기록으로 처리 상태의 가시성 확보
- 4xx 응답을 통한 잘못된 서명 요청의 재시도 중단 유도 및 시스템 부하 방지
실천 포인트
- 모든 Webhook 수신단에서 Signature Verification 필수 적용 및 400 에러 처리 - Event ID를 기반으로 한 고유 제약 조건 설정으로 중복 수신 방지 - 비즈니스 로직 수행 전 DB Queue 저장을 통한 응답 시간 최소화 - 실패한 이벤트의 재처리를 위한 Error Log 컬럼 및 Processor Drain 메커니즘 구축 - 로컬 환경에서 Stripe CLI를 활용한 이벤트 타입별 시나리오 테스트 수행