피드로 돌아가기
Metering a Paid API Without Overselling: the Credit Ledger Behind a Solo SaaS
Dev.toDev.to
Backend

Concurrent Race Condition 해결을 통한 API Credit Ledger 무결성 확보

Metering a Paid API Without Overselling: the Credit Ledger Behind a Solo SaaS

Ritusmoi Kaushik2026년 6월 16일6intermediate

Context

Vision 모델 기반의 PDF 추출 서비스에서 실제 사용량 확정 전 과금을 처리해야 하는 기술적 제약 존재. 단순 Read-Modify-Write 방식의 잔액 업데이트 구조로 인해 동시 요청 시 Credit 초과 사용이 가능한 Race Condition 발생.

Technical Solution

  • Reserve → Settle → Refund 프로세스 도입을 통한 과금 가능 여부 선제적 검증 및 최종 정산 구조 설계
  • Python 레벨의 잔액 계산을 배제하고 Database의 Conditional UPDATE(WHERE remaining >= take)를 통한 원자적 상태 변경 구현
  • SQLite의 Row Lock과 Rowcount 검증을 활용하여 동시성 요청 중 단 하나의 요청만 성공시키는 Gate 메커니즘 적용
  • Side Effect(외부 API 호출) 발생 전 In-flight 상태를 마킹하여 Idempotency 범위를 데이터베이스 쓰기에서 API 호출 단계까지 확장
  • Immutable한 Append-only Ledger 구조를 채택하여 모든 트랜잭션을 기록하고 잔액 합산 방식의 Reconciliation Invariant 구축

- 잔액 업데이트 시 '조회 후 수정'이 아닌 '조건부 업데이트' 쿼리를 사용하여 Race Condition 방지 - Idempotency Key 적용 시 DB 레코드 생성뿐만 아니라 외부 API 호출과 같은 Side Effect 구간 전체를 커버하는지 확인 - 무결성 검증을 위해 변경 이력을 모두 남기는 Append-only Ledger와 주기적인 데이터 정합성 체크 로직 도입 - 동시성 버그 재현을 위해 In-memory DB가 아닌 실제 디스크 기반 DB 환경에서 테스트 수행

원문 읽기