우수한 분해
1) 접근법의 본질
우수한 저하는 리소스가 부족하거나 종속성이 실패하거나로드 피크가있을 때 시스템을 더 단순하지만 유용한 모드로 관리하는 것입니다. 목표는 보조 기능과 품질을 희생하여 사용자 가치 및 플랫폼 복원력의 핵심을 유지하는 것입니다.
주요 속성:- 예측 가능성: 사전 정의 된 시나리오 및 저하 "사다리".
- 계약 적중 반경: 격리 기능 및 제약 조건.
- 관찰 가능성: 메트릭, 로그 및 추적 "어떤 수준의 열화가 활성화되고 왜"
- 가역성: 정상으로의 빠른 복귀.
2) 원리와 경계
1. 주요 내용을 저장하십시오: 기본 SLA/SLO (예: "구매", "로그인", "검색") -우선 순위가 보조 (아바타, 권장 사항, 애니메이션) 보다 높습니다.
2. 실패 대 실패:- 보안, 지불, 권리-실패 (위반보다 더 나은 거부).
- 기울어 진 콘텐츠, 힌트, 아바타-폴백으로 열립니다.
- 3. 시간 예산: 하향식 시간 초과 (클라이언트 <게이트웨이 <서비스). 만료 후-무기한 퇴각 대신 분해.
- 4. 비용 관리: 열화는 오류를 "숨기는" 것이 아니라 CPU/IO/네트워크 소비를 줄여야합니다.
3) 분해 수준
3. 1 클라이언트/UX
보조 위젯의 해골/플레이스 홀더 및 "게으른" 로드.
부분 UI: 중요 블록이로드되고 보조 블록이 숨겨지거나 단순화됩니다.
클라이언트 측 캐시: "데이터가 더 이상 사용되지 않을 수 있음" 으로 표시된 LKG (Last-Good).
오프라인 모드: 나중에 반복되는 명령 대기열 (idempotence!).
3. 2 Edge/CNC/WAF/API 게이트웨이
부실한 동안: 캐시를 제공하고 배경을 업데이트합니다.
속도 제한 및 부하 흘림: 과부하시 배경/익명 트래픽을 재설정하십시오.
지오 펜스/가중 라우팅: 트래픽이 가장 가까운 건강한 지역으로 전환됩니다.
3. 3 서비스 계층
부분 응답: + '경고' 데이터의 일부를 반환합니다.
읽기 전용 모드: 돌연변이 (플래그) 를 일시적으로 금지합니다.
브라운 아웃: 자원 집약적 기능의 일시적인 비활성화 (권장 사항, 강화).
적응 형 동시성: 동시성을 동적으로 줄입니다.
3. 4 데이터/스트리밍
TTL (일시적으로) 을 사용하여 진실의 원천으로 캐시: "아무것도 아닌 것보다 낫습니다".
모델/알고리즘의 정확도 저하 (빠른 경로 대 정확한 경로).
디퍼/큐-무거운 작업을 배경으로 전송합니다 (아웃 박스/작업 대기열).
우선 순위 대기열: 별도의 클래스에서 중요한 이벤트.
4) 악화 "사다리" (플레이 북)
검색 API의 예:- L0 (정상) → L1: 개인화 및 배너 숨기기 → L2: 동의어/퍼지 검색 → L3 비활성화: 응답 크기 및 타임 아웃을 300ms → L4로 제한: 캐시 5 분 → L5: "읽기 전용 및 캐시 만" + 재계산 요청 대기열.
각 레벨에 대해 다음이 기록됩니다
트리거: CPU 과부하> 85% p95> 대상, 오류> 임계 값, Kafka> 임계 값 플래그, 종속성 플래그.
동작: X 플래그를 켜고 동시성을 N으로 낮추고 Y 소스를 캐시로 전환하십시오.
종료 기준: 10 분의 녹색 지표, 리소스 헤드 룸.
5) 의사 결정 정책
5. 1 잘못된 예산 및 SLO
브라운 아웃/쉐딩 트리거로 오류 예산 연소율을 사용하십시오.
정책: "15 분 이내에 연소율> 4 × 인 경우 L2 열화를 켜십시오".
5. 2 입학 통제
p99를 보장하고 큐 붕괴를 방지하기 위해 중요한 경로에서 들어오는 RPS를 제한합
5. 3 우선 순위
수업: 대화식> 시스템> 배경.
임차인 우선 순위 (금/은/청동) 및 정의 (공정 점유).
6) 패턴 및 구현
6. 1 로드 흘림
모든 리소스를 가져 오기 전에 요청을 삭제하십시
'Redue-After' 및 정책 설명 (고객) 을 사용하여 '429 '/' 503' 을 반환하십시오.
특사 (적응 형 동시성 + 회로 파괴)
yaml typed_extension_protocol_options:
envoy. filters. http. adaptive_concurrency:
"@type": type. googleapis. com/envoy. extensions. filters. http. adaptive_concurrency. v3. AdaptiveConcurrency gradient_controller_config:
sample_aggregate_percentile: 90 circuit_breakers:
thresholds:
- max_requests: 2000 max_pending_requests: 500 max_connections: 1000
6. 2 브라운 아웃 (임시 단순화)
아이디어: 리소스가 고갈 될 때 기능의 "밝기" (비용) 를 줄입니다.
kotlin class Brownout(val level: Int) { // 0..3 fun recommendationsEnabled() = level < 2 fun imagesQuality() = if (level >= 2) "low" else "high"
fun timeoutMs() = if (level >= 1) 150 else 300
}
6. 3 부분 응답 및 경고
응답으로 '경고 '/' 저하' 필드:json
{
"items": [...],
"degradation": {
"level": 2,
"applied": ["cache_only", "no_personalization"],
"expiresAt": "2025-10-31T14:20:00Z"
}
}
6. 4 가장자리에서 상태 수정 (Nginx)
nginx proxy_cache_valid 200 10m;
proxy_cache_use_stale error timeout http_500 http_502 http_504 updating;
proxy_cache_background_update on;
6. 5 읽기 전용 스위치 (Kubernetes + 플래그)
yaml apiVersion: v1 kind: ConfigMap data:
MODE: "read_only"
The code should check MODE and block mutations with a friendly message.
6. 6 카프카: 역압 및 큐 클래스
무거운 소비자를 더 작은 'max로 전환하십시오. 여론 조사. 레코드 ', 생산 배치 및 제한.
주제/할당량별로 "중요" 및 "대량" 이벤트를 분리하십시오.
6. 7 UI: 우아한 대체
"무거운" 위젯을 숨기고 캐시/스켈레톤을 표시하며 오래된 데이터를 명확하게 레이블을 지정하십시오
7) 설정 예
7. 1 Istio 이상 치 + 우선 순위 풀
yaml outlierDetection:
consecutive5xx: 5 interval: 10s baseEjectionTime: 30s maxEjectionPercent: 50
7. 2 Nginx: 나이프 아래의 배경 트래픽
nginx map $http_x_priority $bucket { default low; high high; }
limit_req_zone $binary_remote_addr zone=perip:10m rate=20r/s;
limit_req_status 429;
server {
location /api/critical/ { limit_req zone=perip burst=40 nodelay; }
location /api/background/ {
limit_req zone = perip burst = 5 nodelay; # stricter
}
}
7. 3 기능 플래그/킬 스위치
동적 구성 (ConfigMap/Consul) 으로 저장하고 릴리스없이 업데이트하십시오.
별도의 기능 및 글로벌 플래그, 로그 활성화.
8) 관찰 가능성
8. 1 메트릭
'저하 _ 수준 {서비스}' 은 현재 수준입니다.
'shed _ quirs _ total {route, reason}' -재설정 된 금액과 이유.
'stale _ responds _ total' -얼마나 많은 캐시가 발행되었습니까?
(PHP 3 = 3.0.6, PHP 4)
'brownout _ activations _ total {figure}'.
잘못된 예산: 연소율, SLO 위반 비율.
8. 2 추적
스팬 속성: '분해 = 참', '레벨 = 2', '이유 = 업스트림 _ 타임 아웃'.
배송/헤지 쿼리 사이를 연결하여 꼬리에 대한 기여를 확인하십시오.
8. 3 개의 로그/경고
원인과 소유자가 변경된 악화 수준 스위치 이벤트.
"고착" 레벨에 대한 경고 (저하가 너무 오래 지속됨).
9) 위험 관리 및 보안
인증/인증/데이터 무결성을 저하시키지 마십시오: 더 나은 실패.
PII 마스킹은 모든 모드에서 유지됩니다.
금융/지불: 엄청난 거래 만, 엄격한 타임 아웃 및 롤백; 의심의 여지없이-읽기 전용/보류.
10) 반 패턴
사용자에게 프롬프트하지 않고 원격 측정없이 조용한 분해.
하중 흘림 및 짧은 타임 아웃 대신 폭풍을 다시 트레이하십시오.
세분화없이 글로벌 "스위치" - 거대한 폭발 반경.
동일한 캐시/큐에서 prod 및 가벼운 경로를 혼합하십시오.
영원한 열화: "새로운 표준", 잊혀진 출구 기준으로서의 브라운 아웃.
부동산 쓰기: 부실 데이터를 기반으로 작성을 시도합니다.
11) 구현 점검표
- 핵심 가치 및 중요한 사용자 시나리오가 정의되었습니다.
- 트리거 및 출력이있는 서비스/도메인 별 분해 사다리가 컴파일됩니다.
- 타임 아웃/제한 및 서버 측로드 흘림이 입력됩니다.
- 요율 제한 및 우선 순위 트래픽 클래스가 구성됩니다.
- 부분 응답 구현, 읽기 전용, 부실한 동안 수정.
- 감사가있는 통합 기능 플래그/킬 스위치.
- 열화 수준 및 원인에 대한 측정/추적/경고.
- 과부하/오류가 시뮬레이션 된 정규 게임 데이 연습.
- SLO 문서화 및 오류 예산 → 저하 정책.
12) FAQ
Q: 브라운 아웃을 언제 선택하고 언제 흘릴 것인가?
A: 목표가 실패없이 요청 비용을 줄이는 것입니다. 단순화조차 도움이되지 않을 때 시스템을 보호하는 것이 목표라면 로그인을 흘리십시오.
Q: 사용자에게 열화를보고합니까?
A: 중요한 시나리오의 경우 예 ("제한된 모드" 배지). 투명성은 지원과 불만을 줄입니다.
Q: 캐시를 진실의 원천으로 만들 수 있습니까?
A: 일시적으로-명시 적 SLA 및 노화 레이블이 있습니다. 돌연변이의 경우-금지되어 있습니다
Q: retrai를 "파손" 하지 않는 방법?
A: 짧은 타임 아웃, 지터가있는 지수 백오프, demotency 및 시도 제한; 안전한 작업 만 재구성하십시오.
13) 총계
우수한 저하는 건축 계약 및 통제 된 운영 모드 세트로, 지표 신호 및 잘못된 예산으로 켜집니다. 올바르게 설계된 계단, 엄격한 타임 아웃 및 흘림, 캐쉬백 및 브라운 아웃, 강력한 관찰 가능성-플랫폼은 폭풍우에도 유용하고 경제적입니다.