471 lines
14 KiB
JSON
471 lines
14 KiB
JSON
{
|
|
"schema_version": 2,
|
|
"document": "API 재시도는 횟수가 아니라 부하 예산으로 설계한다",
|
|
"citation_style": "hidden",
|
|
"reader_document_contains_internal_source_ids": false,
|
|
"sections": [
|
|
{
|
|
"section_id": "01-problem-scene",
|
|
"intent": "problem_scene",
|
|
"title": "코드보다 먼저 드러난 문제",
|
|
"reader_question": "독자가 공감할 수 있는 구체적인 상황에서 어떤 문제가 드러났는가?",
|
|
"decision_requirements": [],
|
|
"evidence": [
|
|
{
|
|
"id": "S1",
|
|
"title": "Timeouts, retries, and backoff with jitter",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
},
|
|
{
|
|
"id": "S2",
|
|
"title": "RFC 9110, HTTP Semantics — Idempotent Methods",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://datatracker.ietf.org/doc/html/rfc9110#section-9.2.2",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
},
|
|
{
|
|
"id": "S3",
|
|
"title": "Retry strategy",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://cloud.google.com/storage/docs/retry-strategy",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
}
|
|
],
|
|
"evidence_gap": false
|
|
},
|
|
{
|
|
"section_id": "02-constraints",
|
|
"intent": "constraints",
|
|
"title": "문제를 어렵게 만든 제약",
|
|
"reader_question": "단순한 해법을 막은 프로젝트 제약은 무엇이었는가?",
|
|
"decision_requirements": [],
|
|
"evidence": [
|
|
{
|
|
"id": "S1",
|
|
"title": "Timeouts, retries, and backoff with jitter",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
},
|
|
{
|
|
"id": "S2",
|
|
"title": "RFC 9110, HTTP Semantics — Idempotent Methods",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://datatracker.ietf.org/doc/html/rfc9110#section-9.2.2",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
},
|
|
{
|
|
"id": "S3",
|
|
"title": "Retry strategy",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://cloud.google.com/storage/docs/retry-strategy",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
}
|
|
],
|
|
"evidence_gap": false
|
|
},
|
|
{
|
|
"section_id": "03-options",
|
|
"intent": "options",
|
|
"title": "검토한 선택지와 막힌 지점",
|
|
"reader_question": "어떤 대안들을 검토했고 각각 어디에서 비용이 생겼는가?",
|
|
"decision_requirements": [
|
|
"상황·제약",
|
|
"선택",
|
|
"선택 이유",
|
|
"검토한 대안",
|
|
"수용한 비용",
|
|
"보완 가드레일"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"id": "S1",
|
|
"title": "Timeouts, retries, and backoff with jitter",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
},
|
|
{
|
|
"id": "S2",
|
|
"title": "RFC 9110, HTTP Semantics — Idempotent Methods",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://datatracker.ietf.org/doc/html/rfc9110#section-9.2.2",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
},
|
|
{
|
|
"id": "S3",
|
|
"title": "Retry strategy",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://cloud.google.com/storage/docs/retry-strategy",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
}
|
|
],
|
|
"evidence_gap": false
|
|
},
|
|
{
|
|
"section_id": "04-decision-rationale",
|
|
"intent": "decision_rationale",
|
|
"title": "선택의 이유와 지킨 경계",
|
|
"reader_question": "왜 이 선택을 했으며 무엇을 일부러 포기하거나 금지했는가?",
|
|
"decision_requirements": [
|
|
"상황·제약",
|
|
"선택",
|
|
"선택 이유",
|
|
"검토한 대안",
|
|
"수용한 비용",
|
|
"보완 가드레일"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"id": "S1",
|
|
"title": "Timeouts, retries, and backoff with jitter",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
},
|
|
{
|
|
"id": "S2",
|
|
"title": "RFC 9110, HTTP Semantics — Idempotent Methods",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://datatracker.ietf.org/doc/html/rfc9110#section-9.2.2",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
},
|
|
{
|
|
"id": "S3",
|
|
"title": "Retry strategy",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://cloud.google.com/storage/docs/retry-strategy",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
}
|
|
],
|
|
"evidence_gap": false
|
|
},
|
|
{
|
|
"section_id": "05-mechanism",
|
|
"intent": "mechanism",
|
|
"title": "선택이 코드와 흐름에 반영되는 방식",
|
|
"reader_question": "결정이 모듈, 인터페이스, 제어 흐름에 어떻게 반영되는가?",
|
|
"decision_requirements": [],
|
|
"evidence": [
|
|
{
|
|
"id": "S1",
|
|
"title": "Timeouts, retries, and backoff with jitter",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
},
|
|
{
|
|
"id": "S2",
|
|
"title": "RFC 9110, HTTP Semantics — Idempotent Methods",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://datatracker.ietf.org/doc/html/rfc9110#section-9.2.2",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
},
|
|
{
|
|
"id": "S3",
|
|
"title": "Retry strategy",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://cloud.google.com/storage/docs/retry-strategy",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
}
|
|
],
|
|
"evidence_gap": false
|
|
},
|
|
{
|
|
"section_id": "06-evidence-verification",
|
|
"intent": "evidence_verification",
|
|
"title": "결정이 지켜지는지 확인하는 방법",
|
|
"reader_question": "설명한 경계와 결과가 실제로 유지되는지 어떻게 확인하는가?",
|
|
"decision_requirements": [],
|
|
"evidence": [
|
|
{
|
|
"id": "S1",
|
|
"title": "Timeouts, retries, and backoff with jitter",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
},
|
|
{
|
|
"id": "S2",
|
|
"title": "RFC 9110, HTTP Semantics — Idempotent Methods",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://datatracker.ietf.org/doc/html/rfc9110#section-9.2.2",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
},
|
|
{
|
|
"id": "S3",
|
|
"title": "Retry strategy",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://cloud.google.com/storage/docs/retry-strategy",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
}
|
|
],
|
|
"evidence_gap": false
|
|
},
|
|
{
|
|
"section_id": "07-tradeoffs",
|
|
"intent": "tradeoffs",
|
|
"title": "얻은 것, 잃은 것, 적용하지 않을 때",
|
|
"reader_question": "이 선택의 비용과 한계는 무엇이며 언제 다른 선택이 나은가?",
|
|
"decision_requirements": [
|
|
"상황·제약",
|
|
"선택",
|
|
"선택 이유",
|
|
"검토한 대안",
|
|
"수용한 비용",
|
|
"보완 가드레일"
|
|
],
|
|
"evidence": [
|
|
{
|
|
"id": "S1",
|
|
"title": "Timeouts, retries, and backoff with jitter",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
},
|
|
{
|
|
"id": "S2",
|
|
"title": "RFC 9110, HTTP Semantics — Idempotent Methods",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://datatracker.ietf.org/doc/html/rfc9110#section-9.2.2",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
},
|
|
{
|
|
"id": "S3",
|
|
"title": "Retry strategy",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://cloud.google.com/storage/docs/retry-strategy",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
}
|
|
],
|
|
"evidence_gap": false
|
|
},
|
|
{
|
|
"section_id": "08-conclusion",
|
|
"intent": "conclusion",
|
|
"title": "결국 지키려던 것은 무엇이었나",
|
|
"reader_question": "세부 기술을 걷어냈을 때 남는 판단은 무엇인가?",
|
|
"decision_requirements": [],
|
|
"evidence": [],
|
|
"evidence_gap": false
|
|
}
|
|
],
|
|
"sources": [
|
|
{
|
|
"id": "S1",
|
|
"title": "Timeouts, retries, and backoff with jitter",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
},
|
|
{
|
|
"id": "S2",
|
|
"title": "RFC 9110, HTTP Semantics — Idempotent Methods",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://datatracker.ietf.org/doc/html/rfc9110#section-9.2.2",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
},
|
|
{
|
|
"id": "S3",
|
|
"title": "Retry strategy",
|
|
"source_type": "external",
|
|
"status": "",
|
|
"path": "",
|
|
"heading": "",
|
|
"line_start": null,
|
|
"line_end": null,
|
|
"url": "https://cloud.google.com/storage/docs/retry-strategy",
|
|
"accessed": "2026-07-23",
|
|
"claim_ids": [],
|
|
"decision_ids": [],
|
|
"priority": 0.0
|
|
}
|
|
]
|
|
}
|