--- kind: REFERENCE slug: retryability-needs-both-idempotency-and-category title: 재시도 가능성은 멱등성과 실패 범주를 함께 봐야 정해진다 topic: http-failure-classification project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: reference:retryability-needs-both-idempotency-and-category verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지 않았다 --- # 재시도 가능성은 멱등성과 실패 범주를 함께 봐야 정해진다 ## 목적 한 축만 보고 재시도를 정해서, 비멱등 요청을 반복하거나 영구 실패를 무한히 되풀이하는 것을 막는다. ## 규칙 1. 두 입력의 곱이다 범주가 재시도 가능하고 동시에 요청이 재시도 안전할 때만 재시도한다. 범주만 보면 비멱등 요청을 재시도하고, 멱등성만 보면 영구 실패를 반복한다. 2. 전송되지 않았다는 증거는 멱등성 요구를 완화한다 아무것도 서버에 닿지 않았음이 증명되면 그 시도는 없던 일이므로 멱등성을 묻지 않아도 된다. 다만 그 증거는 증명일 때만 쓴다. 3. 증거는 승격하지 않는다 일반적인 엔진 입출력 실패를 전송되지 않음으로 올리지 않는다. 모르는 것은 모르는 채로 둔다. 추측해서 올린 판정이 중복 결제를 만든다. 4. 응답이 전달되기 시작했으면 재시도하지 않는다 첫 바이트가 호출자에게 전달된 뒤에는 범주와 무관하게 재시도가 막힌다. 5. 정책의 화이트리스트로 terminal 판정을 되살리지 않는다 화이트리스트는 어떤 범주가 재시도될 수 있는지를 넓히지, 이 실패에 대한 판정을 뒤집지 않는다. ## 적용 조건 HTTP gRPC 메시징 클라이언트의 재시도 결정 멱등성 여부가 요청마다 다른 경로 ## 예외 분류기가 terminal 로 표시한 실패는 정책으로 되살릴 수 없다. ## 예시 이 저장소는 전송되지 않음 증거를 별도 축으로 두어 완화를 표현한다. 재시도 컨텍스트에 HTTP 메서드가 없고, 멱등성 키가 전송 여부까지 요구하며, 첫 바이트 전달은 되돌릴 수 없는 래치다. 부분 응답은 안전하게 멱등인 요청에 대해서만 재시도된다. 그 외에는 원격 결과 불명으로 남긴다. ## 관계 - **전송 실패를 단계와 범주 두 축으로 모델링한다** 이 규칙의 입력을 만드는 모델이다. - **재시도 안전성은 증거에 기반해 판정한다** 이 규칙을 채택한 프로젝트 결정이다.