"'실패하면 재시도' 는 그 실패가 아무것도 안 했다고 조용히 가정해. 유료 호출엔, 그 가정이 도박이야."
가장 반사적인 좋은 관행이, 함정으로
네트워크 호출을 자동 재시도로 감싸는 건 워낙 표준 위생이라 대부분의 HTTP client 가 기본으로 해. 그리고 재시도가 설계된 작업 — idempotent 하고 부작용 없는 읽기 — 엔 정확히 맞아: 호출이 효과가 없었거나 알 수 없었거나고, 어느 쪽이든 다시 돌려도 무해해. 유료 전사 호출은 그 둘 다 아냐. 돈을 움직이고, 한 번 제출되면 이미 돌았을 수 있어. 그래서 Recall 은 얼핏 틀려 보이는 걸 해: 유료 호출을 하는 client 에서 자동 재시도를 완전히 없애.
이유가 정확해. 요청 제출 후의 transport timeout 은 provider 가 job 을 돌렸는지 아무것도 안 알려줘. provider 가 전사하고 청구했는데 응답만 전송 중 잃었을 수 있어. 그 순간의 자동 재시도는 blind 두 번째 구매야. 유료 경계를 넘어 적용된 재시도 반사는 회복력으로 분장한 돈 누수야.
유료 경계가 선이야
고침은 '절대 재시도 마' 가 아냐 — '되돌릴 수 없는 행위가 정확히 어디인지 알고, 자동 재시도가 절대 그걸 넘지 못하게' 야. Recall 은 유료 POST 에 단단한 선을 그어:
- 경계 전 — source hash, 오디오 proxy 빌드, ledger 예약 — 아무것도 안 썼어. 여기 실패는 재시도 안전해, 첫 시도가 증명 가능하게 아무 비용도 안 들었으니까. Recall 은 정확히 이걸 노출해: '유료 경계 전으로 알려진 실패를 재시도' 작업.
- 경계에서 또는 후 — POST 가 나갔어. 여기 실패는 무해함을 증명 못 하니까, 절대 자동 재시도 안 해. 지난 레슨의 ambiguous 상태가 돼서, 사람에게 escalate 돼.
그래서 재시도는 금지된 게 아냐 — 경계 지어진 거야. 엔진은 싸고 증명 가능하게 효과 없는 쪽에선 자유롭게 재시도하고 돈 경계에서 딱 멈춰. 기술은 그 경계가 정확히 어디 앉는지 아는 거야, 자동 재시도는 첫 시도가 아무것도 안 했다는 네 증명만큼만 안전하니까.
회복력은 재시도랑 같은 게 아냐
반사가 깊으니 분명히 말할 가치가 있어: 시스템은 극도로 회복력 있으면서도 자동 재시도를 거부할 수 있어. Recall 은 크래시, 연결 끊김, provider timeout 을 버텨 — 근데 그걸 유료 endpoint 를 blind 로 다시 때려서가 아니라 durable 예약, outbox, idempotent 수락으로 이뤄. 진짜 회복력은 모든 상태를 복구 가능하게 만드는 거지, 같은 호출을 될 때까지 두들기는 게 아냐. 작업이 공짜고 idempotent 면, 마음껏 재시도해. 돈을 쓰거나 부작용 없음을 증명 못 하면, 회복력은 복구할 만큼 기록하고 진실을 확인할 수 있는 사람에게 불확실성을 넘기는 거야.