피드로 돌아가기
The webhook inbox pattern: stop writing this controller by hand
Dev.toDev.to
Backend

DB Unique Constraint 기반의 Webhook Inbox Pattern으로 Race Condition 완전 제거

The webhook inbox pattern: stop writing this controller by hand

Jibran Usman2026년 6월 16일6intermediate

Context

애플리케이션 계층의 존재 여부 확인(exists?) 후 생성하는 방식의 TOCTOU Race Condition 발생 가능성 확인. 중복 처리로 인한 과금 및 메일 중복 발송 등 데이터 정합성 훼손 문제 직면.

Technical Solution

  • DB 레벨의 Unique Index[provider, event_id]를 통한 원자적(Atomic) 중복 제거 구조 설계
  • 수신 즉시 저장 후 비동기로 처리하는 Inbox Pattern 도입을 통한 Controller 책임 분리
  • request.body.rewind 처리를 통한 Middleware의 Body 소비 문제 해결 및 데이터 유실 방지
  • Payload, 상태, 에러 메시지를 포함한 Event Table 설계를 통해 실패한 이벤트의 가시성 확보
  • Admin Dashboard를 통한 실패 이벤트의 수동 Retry 메커니즘 구현으로 운영 복구 능력 강화

- 분산 환경의 중복 제거 시 Application Check 대신 DB Unique Constraint 우선 고려 - 외부 Webhook 수신 시 '저장 후 처리' 아키텍처를 통해 재처리 가능성(Replayability) 확보 - Request Body를 여러 번 읽어야 하는 경우 Rewind 처리가 누락되었는지 확인 - 단순 라우팅 라이브러리와 저장/중복 제거 레이어의 역할을 명확히 구분하여 설계

원문 읽기