피드로 돌아가기
Your AI Agent Budget Check Has a Race Condition
Dev.toDev.to
Backend

Your AI Agent Budget Check Has a Race Condition

AI 에이전트의 예산 체크 로직을 단순 읽기-쓰기 방식에서 원자적 예약-실행-커밋 패턴으로 변경해 동시성·재시도·장애 상황에서의 예산 추적 정확성 확보

Albert Mavashev2026년 3월 25일8intermediate

Context

동시 워커, 재시도 로직, 프로세스 재시작이 있는 프로덕션 환경에서 애플리케이션 레벨의 단순 예산 체크(remaining = get_remaining_budget(); if remaining < estimated_cost: ...)는 타이밍 윈도우 문제로 인해 중복 지출을 방지하지 못한다. 예를 들어 남은 예산이 $5일 때 10개 워커가 동시에 체크하면 모두 동일한 값을 읽고 진행되며, 네트워크 실패 후 재시도 또는 LLM 호출 후 기록 전 프로세스 중단 시 예산 추적 상태가 불일치한다.

Technical Solution

  • 예산 체크를 단순 읽기에서 원자적 예약으로 변경: 호출 전 reserve_budget(scope, amount, idempotency_key)로 예산을 미리 확보하여 다른 워커의 동시 접근 차단
  • 재시도 안전성 확보를 위해 idempotency_key(run_step_id) 도입: 같은 단계의 재시도는 동일한 예약 ID를 재사용하여 중복 예약 방지
  • 예외 처리 시 release_budget(reservation_id) 추가: LLM 호출 실패 또는 네트워크 오류 시 예약된 예산을 즉시 반환하여 상태 일관성 유지
  • 실제 비용으로 정산하는 commit_budget(reservation_id, actual_cost) 단계 도입: 예약 금액과 실제 사용 금액의 차이를 원자적으로 처리
  • 애플리케이션 레벨 로직을 독립 서비스로 추출: 테넌트/워크플로우/도구 간 공유 예산이 필요한 경우 원자적 예약, 멱등성, 재시도 안전성, 감사 이력을 중앙화된 인프라에서 관리

Key Takeaway

다중 워커가 공유 자원(예산)에 접근하는 환경에서는 체크-실행-기록의 순차적 흐름으로는 분산 시스템 수준의 정확성을 보장할 수 없으며, 예약-실행-커밋 패턴으로 결정 지점을 단일 원자 연산으로 집중시켜야 한다. 예산 제어가 단순 애플리케이션 래퍼를 넘어서면 동시성, 멱등성, 장애 복구까지 고려한 분산 시스템 문제로 격상되어 독립 서비스화가 필수다.


여러 에이전트 워크플로우가 공유 예산 풀에서 LLM 호출 비용을 차감하는 환경에서는 사전 예약(reserve) → LLM 실행 → 실제 비용 커밋(commit) 또는 예약 해제(release)의 3단계 패턴을 도입하면, 동시 요청·재시도·중단 상황에서도 예산 오버런을 완벽히 방지할 수 있다.

원문 읽기