레벨 1 · 불량 배포
09시 10분에 새 빌드가 배포됩니다. 이번 달은 이미 힘들었습니다: 에러 버짓이 20%밖에 남지 않았습니다. 배포 몇 분 뒤 소진율 호출 알림이 울립니다. 버짓을 지키세요.
- 종료 시 남은 에러 버짓 18.5% 이상
- 배포 이후 평균 오류율 0.65% 이하
- 인스턴스 비용 9.50달러 이하
당신은 웹 서비스의 온콜 담당자입니다: 로드 밸런서 뒤의 인스턴스 무리, 데이터베이스 앞의 캐시, 그리고 99.9% 가용성 목표. 모델은 매분 교과서 공식으로 대기 지연, 타임아웃, 캐시 적중, 데이터베이스 부하를 계산하고, 당신의 결정에 드는 비용도 계산합니다.
인스턴스 수의 하한. 올리면 즉시 띄우지만, 트래픽을 받기까지 부팅 시간이 걸립니다.
사용률 목표 추적 방식. 부팅 중인 인스턴스가 있으면 추가 확장을 하지 않습니다. 끄면 최소 인스턴스 수로 고정됩니다.
낮출수록 여유와 비용이 늘어납니다. 측정 사용률은 100%를 넘지 못해, 포화된 무리는 단계적으로만 커집니다.
TTL이 길면 적중이 늘지만, 응답이 더 오래된 데이터일 수 있습니다(평균 나이 ≈ TTL/2).
6분 동안 자주 쓰는 키를 채웁니다(분당 캐시 12%). 대가로 데이터베이스 쿼리가 초당 600개 늘어납니다.
저우선순위 30%(미리 가져오기, 배치, 크롤러) 중 로드 밸런서에서 “나중에 다시”로 돌려보낼 비율.
무거운 기능으로, 요청마다 CPU 20ms와 데이터베이스 쿼리 1개를 더합니다. 끄면 기능을 줄여 버팁니다(점진적 기능 축소).
마지막 정상 빌드를 새 인스턴스 무리에 다시 배포한 뒤(5분, 비용 두 배) 트래픽을 넘깁니다. 다시 누르면 준비가 처음부터 시작되고, 불량 빌드가 없을 때 누르면 비용만 듭니다.
| 소진율 (1시간) | 0.0 × |
|---|---|
| 요청 | 1125 req/s |
| 서비스 중 인스턴스 | 10 |
| 부팅 중 인스턴스 | 0 |
| 캐시 적중률 | 77 % |
| 데이터베이스 사용률 | 19 % |
| 차단된 트래픽 | 0 % |
| 인스턴스 비용 | 4.00 $/h |
| 누적 비용 | 0.00 $ |
| 캐시 응답 평균 나이 | 30 s |
| 불량 빌드로 가는 트래픽 | 0 % |
| 추천 기능 제공 | 100 % |
09시 10분에 새 빌드가 배포됩니다. 이번 달은 이미 힘들었습니다: 에러 버짓이 20%밖에 남지 않았습니다. 배포 몇 분 뒤 소진율 호출 알림이 울립니다. 버짓을 지키세요.
서비스 링크가 빠르게 퍼지고 있어 오늘 오전 중 트래픽 폭주가 예상됩니다 — 언제, 얼마나 클지는 아무도 모릅니다. 오늘은 새 인스턴스가 부팅하는 데 8분이 걸립니다. 폭주가 오면, 놀고 있는 용량에 돈을 태우지 않으면서 오류와 지연을 낮게 유지하세요.
한낮 정점 시간에 유지보수 스크립트가 캐시 전체를 비웁니다. 이제 모든 요청이 데이터베이스로 가는데, 데이터베이스는 평소 85% 적중률에 맞춰 설계되었습니다. 데이터베이스를 과부하로 몰지 않고 서비스를 되살리세요.
시뮬레이터가 쓰는 모든 관계식과 출처입니다. 가정으로 표시된 상수는 설명을 위한 보정값입니다.
λ(t) = base × (1 + 0.25·sin(2π(t + clock − 6 h)/24 h)) × surge(t), clock = time of day at the start (peak at 12:00); count/min ≈ N(60λ, √(60λ)) × (1 + N(0, 0.02))[6]가정: 작업자 수, 서비스 시간, 데이터베이스 용량, 캐시 크기, 채움 속도, 가격, 불량 빌드의 오류율은 중간 규모 웹 서비스를 가정한 설명용 값입니다.N = instances × 16 workers, a = λ·S; C(a, N) = B / (1 − (a/N)(1 − B)), B = Erlang B[3][6]P(W > t) = C·e^(−(N/S − λ)·t); timeouts = P(W > 2 s); a ≥ N ⇒ failed share = 1 − N/a[3]p99 ≈ S·ln 100 + ln(C/0.01)/(N/S − λ) (service + waiting quantile, an approximation)[3][6]근사: 서비스 시간과 대기 시간의 분위수를 더한 값은 합의 정확한 p99가 아닙니다(조금 높거나 낮을 수 있습니다). 요청이 수 밀리초면 끝나므로 대기열은 1분 안에서는 정상 상태로 봅니다.busy workers L = λ·S ⇒ utilization = λ·S / N[4]hit = warm × rT/(1 + rT), r = λ / 20,000 objects; mean age of a cached answer ≈ T/2[5]DB load = λ·q·(1 − hit); query time = 5 ms/(1 − ρ_db) (≤ 250 ms); S = S_app + (1 − hit)·q·query time[6]가정: 작업자 수, 서비스 시간, 데이터베이스 용량, 캐시 크기, 채움 속도, 가격, 불량 빌드의 오류율은 중간 규모 웹 서비스를 가정한 설명용 값입니다.budget = 1 − SLO = 0.1 %; burn = error rate / 0.1 %; Δbudget per min = burn / 43,200; burn (1 h) = mean error rate over the last 60 min / 0.1 % (window pre-filled with the opening minute)[1][2]desired = ⌈serving × utilization / target⌉ (utilization saturates at 100 %); new instances serve after the boot delay[6]가정: 작업자 수, 서비스 시간, 데이터베이스 용량, 캐시 크기, 채움 속도, 가격, 불량 빌드의 오류율은 중간 규모 웹 서비스를 가정한 설명용 값입니다.16 workers/instance · app time 50 ms (+20 ms and +1 query with the feature on) · 2 queries/request · DB 4,000 queries/s · 20,000 hot objects · cache refill τ = 30 min (slower while the DB is saturated) · warm-up job +12 %/min for 6 min, +600 queries/s · timeout 2 s · 30 % low-priority traffic · bad build +5 % errors, ×1.25 CPU · rollback 5 min · $0.40 per instance-hour · scale-in by ≤ 20 % of the fleet after 10 quiet minutes · up to 40 instances가정: 작업자 수, 서비스 시간, 데이터베이스 용량, 캐시 크기, 채움 속도, 가격, 불량 빌드의 오류율은 중간 규모 웹 서비스를 가정한 설명용 값입니다.난수: 시드가 고정된 mulberry32 생성기. 사용 분포 — 균등, 지수(역CDF), 정규(Box–Muller), 포아송(Knuth). 시드는 화면에 표시되고 공유됩니다.
교육용 모델입니다 — 실제 운영 결정에 쓰지 마세요. 실제 현장은 모든 상수를 자기 장비와 데이터로 보정합니다.