PoCs

아키텍처는 어떤 고장을 받아들이기로 했는지의 기록이다

**모든 패턴은 구매입니다** — 하나의 고장을 막고 **다른 고장을 들여옵니다.** 고장을 빼고 카탈로그만 읽으면 **판단이 아니라 어휘**가 남습니다. 그리고 **실제로 행동을 예측하는 이론은 둘뿐**이라, 읽을 목록은 보이는 것보다 훨씬 짧습니다.

아직 만들지 않았습니다

이 페이지는 카드에 적힌 내용을 펼쳐 보여줄 뿐입니다 — 돌아가는 코드도, 열어볼 데모도 아직 없습니다. 무엇을 왜 만들려는지가 아래에 있습니다.

어떻게 보나

아직 범위 미정이고, **의도적으로 독서 계획이 아닙니다.** 이 저장소에 이미 있는 시스템 하나를 잡고 — **정산 파이프라인이 명백한 후보** — 각 구성요소에 대해 **세 줄**을 씁니다: **느려지면 어떻게 되나, 죽으면 어떻게 되나, 틀린 값을 돌려주면 어떻게 되나.** 그게 **고장 목록**이고, **패턴은 거기에 대한 답**입니다. 그다음 카탈로그를 앞에서부터 읽는 대신 **목록의 항목에 패턴을 붙이고**, 각 패턴마다 **없애는 고장 옆에 들여오는 고장**을 같이 적습니다. 그리고 따로 — **실제로 예측력이 있는 부분입니다** — **도착률과 지연에서 이 시스템에 필요한 동시성을 계산하고**, **이용률 대비 대기시간 곡선을 그려 어디서 꺾이는지** 봅니다. **공식 둘, 반나절.**

기술 노트

각 항목이 실제로 무엇을 보여주고 어떻게 동작하는지 — 위 카드보다 자세한 기술 설명입니다.

아키텍처는 어떤 고장을 받아들이기로 했는지의 기록이다준비 중

목적: **아키텍처는 보통 카탈로그로 공부되는데, 카탈로그는 질문이 제거된 답 목록입니다.** 앞에서부터 읽으면 **패턴 이름은 말하지만 언제 쓰지 말아야 하는지는 못 말하는 사람**이 만들어지고, 그게 **카고 컬트의 정의**입니다. 처방은 **더 읽는 것이 아닙니다.** **모든 패턴은 특정 고장에 대고 산 트레이드**라는 것, 그리고 **시스템 사이를 이전하는 것은 고장이지 패턴이 아니라는 것**을 알아채는 것입니다. **구매라고 말하면 뒷면이 보이고, 놀랄 것은 뒷면에 있습니다.** 복제는 노드 손실을 막고 **낡은 읽기(stale read)를 들여옵니다.** 캐시는 부하를 막고 **무효화를 들여오는데**, 그건 진짜로 어렵습니다. 큐는 스파이크를 흡수하고 **무한정 지연과 순서 상실**을 들여옵니다. 재시도는 일시적 오류를 넘기고 **중복 수행**을 들여오며, 그래서 `the-product-is-resume-not-schedule` 이 **재시도 단위의 멱등성**을 고집합니다. 마이크로서비스는 팀을 분리하고 **분산 트랜잭션을 다시 들여오며**, 덤으로 **이제 모든 호출이 실패할 수 있게** 만듭니다. **슬라이드에 오른쪽 칸을 적는 사람은 없고, 그 결정이 결정인 이유는 통째로 오른쪽 칸입니다.** **그다음이 외울 값어치가 있는 부분입니다. 작고, 실제로 예측하기 때문입니다.** 아키텍처 어휘는 거의 전부 **서술**하고, **예측하는 결과는 둘**입니다. **Little's Law** 는 **동시성 = 도착률 × 지연** 이라, 처리량 요구와 지연 예산을 **동시 슬롯 개수**로 바꿔줍니다 — **서비스 목표를 용량으로 바꾸는 유일한 상용 수단**입니다. **이용률 곡선**은 대기시간이 대략 **이용률 ÷ (1 − 이용률)** 로 자란다고 말합니다. 즉 **대기시간은 부하에 선형이 아닙니다** — 이용률 50%에서 서비스 시간의 약 1배, **90%에서 9배, 95%에서 19배.** **시스템이 차오를 때 지연은 서서히가 아니라 쌍곡선으로 무너지고**, 그래서 **85%를 가리키는 대시보드는 보이는 것만큼 편안한 숫자가 아닙니다.** **이 둘에 자릿수 감각을 더하면 실제 결정의 대부분이 덮입니다.** 레지스터 읽기, 메인메모리 읽기, SSD 읽기, 같은 데이터센터 왕복, 대륙 간 왕복은 **끝에서 끝까지 대략 여덟 자릿수** 떨어져 있습니다. 정확한 수치는 하드웨어를 따라 움직이므로 **인용하기보다 확인할 것**이지만, **비율은 움직이지 않고, 내용은 비율입니다.** **서비스 호출을 하나 더하는 것은 구조 선택이 아니라 그 연산이 이제 어느 자릿수에 사는가에 대한 선택**이고, **그렇게 말하면 대부분의 경우 답이 자명해집니다.** **의도적으로 뺀 것은 분류학이고, 그게 요점입니다.** 그것이 헥사고날이냐 클린이냐 어니언이냐 포트앤어댑터냐는, **의존성이 실제로 안쪽을 향하는가**, 그리고 **그것이 깨졌을 때 누가 알아챌 수 있는가**보다 훨씬 덜 중요합니다. `steal-the-structure` 가 읽을거리 일반에 대해 같은 지시를 합니다 — **내용이 아니라 구조를 가져와라.** **여기서 그 구조가 고장 목록이고, 그것만이 다른 시스템과 만나도 살아남는 유일한 산출물입니다.**

동작 방식: ### 모든 패턴을, 구매로 | 패턴 | 막는 고장 | 들여오는 고장 | |---|---|---| | **복제** | 노드 하나 잃으면 데이터도 잃음 | 복제 지연, 그리고 **맞지만 낡은 읽기** | | **캐시** | 원본에 걸리는 부하와 지연 | **무효화**, 만료 시 **thundering herd** | | **큐** | 스파이크가 소비자를 넘어뜨림 | **무한정 지연, 순서 상실, 아무도 안 보는 적체** | | **재시도** | 일시적 오류가 사용자 오류가 됨 | **중복 수행** — 멱등성 필요 (`the-product-is-resume-not-schedule`) | | **서킷 브레이커** | 느린 의존성 하나가 연쇄로 번짐 | **오신호로 열림**, 그리고 추론하기 어려운 **부분 가용성** (`circuit-breaker-saga`) | | **샤딩** | 단일 노드의 천장 | **교차 샤드 트랜잭션**과 핫키 | | **마이크로서비스** | 팀이 서로를 막음 | **분산 트랜잭션**, 그리고 **모든 호출이 고장 양식이 됨** | **아키텍처 공부의 산출물은 오른쪽 칸입니다.** 왼쪽은 요약만 봐도 누구나 적고, **오른쪽을 자기 경우에 대해 채울 수 있는 사람은 그 시스템을 생각해 본 사람뿐**입니다. ### 서술이 아니라 예측하는 결과 둘 | | 무엇을 말하나 | 무엇을 계산하게 해주나 | |---|---|---| | **Little's Law** | 동시성 = 도착률 × 지연 | "초당 500 요청, 200ms" 를 **"동시 슬롯 약 100개"** 로 — **지연 예산에서 용량 숫자** | | **이용률 곡선** | 대기 ≈ ρ / (1 − ρ) | 이용률 50%면 서비스 시간의 약 1배, **90%면 약 9배, 95%면 약 19배** | **한 번 보면 행동이 바뀌는 쪽은 두 번째**입니다. **이용률 85%인 큐는 문제까지 85% 온 것이 아니라 거의 다 온 것**이고, 높은 이용률을 목표로 하는 용량 계획은 **아낄 필요도 없던 하드웨어와 맞바꿔 지연 절벽을 사는 것**입니다. ### 자릿수 — 실은 이게 내용입니다 레지스터, 메모리, SSD, 같은 데이터센터 네트워크, 대륙 간 네트워크 — **끝에서 끝까지 대략 여덟 자릿수.** **수치는 하드웨어를 따라 움직이고 비율은 안 움직입니다.** 이걸 아는 쓸모는 잡학이 아니라, **"그냥 다른 서비스를 부르면 되지" 가 그 연산이 이제 어느 층에 사는가에 대한 눈에 보이는 결정으로 바뀐다**는 것입니다. 그리고 **무언가를 별도 서비스로 뗄지에 대한 논쟁 대부분은 그 말을 소리내어 하는 순간 정리됩니다.** ### 이전되게 공부하는 법 **앞에서부터 읽지 않습니다.** **내가 소유한 시스템 하나를 골라, 각 구성요소가 느릴 때·죽을 때·틀릴 때 무슨 일이 생기는지 씁니다.** 그 목록은 **패턴 이름과 달리 이식 가능합니다** — **고장은 시스템을 건너 반복되고, 패턴은 그렇지 않습니다.** 그다음 카탈로그를 **내 목록 항목에 대한 답으로** 읽으면, **어떤 패턴이 내게 없는 질문에 답하고 있는지도 자명해집니다** — 그게 **가장 흔하고 가장 비싼 형태의 아키텍처 실수**입니다.