Make Retry Idempotency an Invariant Before You Move a Batch Job to a Free Model Endpoint
개요
Batch Job을 무료 모델 엔드포인트로 이전하는 과정에서 발생할 수 있는 재시도(retry)의 불변성(invariancy) 문제를 해결하는 방법을 설명한다.
주요 내용
* 문제 발생 시나리오: Job이 한 번 제출되었음에도 불구하고 중복된 데이터베이스 레코드 생성 및 고객 혼란을 야기했다. 이는 무료 모델 엔드포인트로 이전한 후 발생했으며, 이전 엔드포인트는 짧은 지연 시간 분포를 가졌기에 드러나지 않았던 잠재적 버그가 노출된 경우다.
* HTTP 재시도의 기본 동작: HTTP 재시도 및 메시지 큐는 기본적으로 "최소 한 번(at-least-once)" 전달을 보장한다. 이를 안전하게 만들기 위한 핵심은 "멱등성(idempotency)"이며, 소비자(consumer)는 메시지가 여러 번 전달되더라도 동일한 논리적 작업을 정확히 한 번만 적용해야 한다.
* 무료 엔드포인트의 영향: 무료 엔드포인트는 평균 응답 시간은 비슷하더라도, 공유된 리소스 및 콜드 스타트(cold start)로 인해 지연 시간의 꼬리(tail)가 훨씬 넓어지는 특징이 있다. 이로 인해 타임아웃이 발생할 가능성이 높아지고, 재시도 시 문제가 발생할 수 있다.
* 지연 시간 분포 측정의 중요성: 단순히 평균값만으로 타임아웃을 설정하는 것은 위험하며, P99와 같은 백분위수(percentile)를 포함한 지연 시간 분포를 측정하여 타임아웃 정책을 결정해야 한다.
* 재시도 안전성을 위한 불변성 확보:
* 운영 키(Operation Key) 사용: 각 재시도 시도마다 새로운 멱등성 키를 생성하는 대신, 논리적 작업 자체를 식별할 수 있는 고유한 운영 키를 사용하여 재시도가 동일한 논리적 작업을 참조하도록 한다. 이는 요청 페이로드의 JSON 직렬화 및 해싱을 통해 구현할 수 있다.
* 실패 시나리오별 대응 정의: 타임아웃, 429 Rate Limited, 5xx 서버 오류, 4xx 유효성 오류 등 각 실패 유형에 따라 안전한 재시도 및 오류 처리 방안을 명확히 정의한다.
* 섀도 트래픽(Shadow Traffic)을 통한 검증: 실제 큐에 적용하기 전에, 두 엔드포인트를 나란히 실행하여 응답 형태, 지연 시간 백분위수, 오류율 등을 비교한다. 섀도우 실행에서 중복 부작용이 발생하지 않는 것이 확인되어야 전환을 진행한다.
* 적용 대상 및 주의사항: 이 접근 방식은 지연 시간 꼬리가 넓은 배치 워크로드에 적합하며, 소비자 코드를 제어할 수 있을 때 유용하다. 실시간 사용자 경험이 중요한 경우나 멱등성 키를 부착할 수 없는 시스템에서는 적용에 신중해야 한다. 무료 티어는 계약이 아닌 실험으로 간주해야 한다.
시사점
Batch Job을 무료 모델 엔드포인트로 이전할 때는 재시도의 멱등성을 불변성으로 확보하는 것이 필수적이며, 이를 위해 지연 시간 분포를 측정하고 재시도 정책을 명확히 정의하며 섀도우 트래픽을 통해 검증하는 절차를 거쳐야 한다.
댓글
GitHub Discussions