속도 제한 및로드 제어
TL; DR
신뢰할 수있는 회로는 여러 수준 (edge → BFF → servis), 공정한 자원 할당 (테넌트/키/경로), SLO 적응 스로틀 링 및 백 프레서 대신 자동 타임 아웃의 한계와 할당량의 조합입니다. "속도" 에 토큰/누출 버킷, 회계 할당량에 대한 슬라이딩 창, 무거운 작동에 대한 경쟁 한계, 분해에 대한 동적 스로틀 링 및 깨지기 쉬운 업스트림에 회로 차단기를 사용하십시오. 모든 것이 관찰되고 플레이 북이 있습니다.
1) iGaming/fintech의 제한이있는 이유
SLO 및 지속 가능성: 재 트레이 눈사태 방지, 토너먼트/이벤트 피크, 지불 급증.
공정성: 한 세입자 또는 파트너가 전체 예산을 "빨리 빠뜨리지" 않습니다.
남용 방지/봇: 로그인/등록, 스팜, 디렉토리 스크랩.
비용: 고가의 통화 격리 (KYC, 보고서, 집계).
준수/공정 사용: 계약에서 공식적인 "공정 사용" 할당량.
2) 분류 제한
3) 알고리즘 및 적용 위치
3. 1 토큰 버킷 (기본값)
매개 변수: 'rate' (토큰/초), 'burst' (최대 마진).
API 읽기, 결제/상태, BFF에 적합합니다.
빈 버킷 → 429 + 'Redure-After'.
3. 2 누출 버킷 (평균)
근로자의 점수를 매기지 않도록 웹 후크에 유용한 RPS의 "철거" 보장.
3. 3 고정 창 대 슬라이딩 창
고정-간단하지만 "경계"; 슬라이딩-창에서 공정한 회계 (최소/시간/일).
계약 할당량에 슬라이딩을 적용하십시오.
3. 동시 한계 4 개
동시에 활성화된 작업을 제한합니다. 수출/보고서, KYC 패키지, 재 처리에 이상적입니다.
부족한 경우 - 429/503 + 큐/폴링.
3. 5 비용/복잡성 제한
GraphQL/검색: 깊이/카디널리티/확장으로 "비용" 을 고려하십시오.
"비싼" 요청의 클리핑/저하, 힌트로 응답.
4) 치수 키
임차인 당 (다중 임대, 지분),
per-api _ key/client _ id (파트너),
경로 당 (보다 심각한 임계 돌연변이)
사용자 당/장치/IP/ASN/geo
BIN/국가 당 (지불 방법, 발행자 및 공급자 보호),
방법 당 (부드럽게, POST/PUT 더 엄격하게).
구성: 기본 키 + "위험 승수" (새 계정, TOR/프록시, 높은 청구 위험).
5) SLO 적응 형 스로틀 링
SLO가 위험에 처했을 때 동적 스로틀링 사용:- 방아쇠: 'p95 대기 시간 TP', '5xx ja', 'queu len Z', 'CPU/IO 채도'.
- 동작: 더 낮은 속도/버스트, 특이 치 배출 가능, "고가의" 라우트 절단, 일시적인 저하 (무거운 필드/집계 없음).
- 반환: N 연속 간격의 신호를 정규화 할 때 단계별 (25 → 50 → 100%).
6) 아키텍처 통합
API 게이트웨이 (가장자리): 1 차 요율/할당량, 지리/ASN, HMAC/JWT 유효성 검사, 429/' Redure-After '.
BFF/서비스 메시: 경로당 얇은/테넌트 당 한계, 동시 제한, 회로 차단기에서 업스트림까지.
서비스 내부: 대형 작업을위한 세마포어, 대기열의 백 프레셔, 바운드 크기의 "작업 풀".
웹 후크: 새는 버킷과 리트레이 버퍼가있는 별도의 침입 엔드 포인트.
7) 구성 (조각)
Kong/NGINX 스타일 (속도 + 버스트):yaml plugins:
- name: rate-limiting config:
policy: local minute: 600 # 10 rps limit_by: consumer fault_tolerant: true
- name: response-ratelimiting config:
limits:
heavy: { minute: 60 }
특사 (회로 + 이상 + 비율):
yaml circuit_breakers:
thresholds: { max_connections: 1000, max_requests: 800 }
outlier_detection:
consecutive_5xx: 5 interval: 5s base_ejection_time: 30s http_filters:
- name: envoy. filters. http. local_ratelimit typed_config:
token_bucket: { max_tokens: 100, tokens_per_fill: 100, fill_interval: 1s }
filter_enabled: { default_value: 100% }
filter_enforced: { default_value: 100% }
동시 한계 (의사):
pseudo sema = Semaphore(MAX_ACTIVE_EXPORTS_PER_TENANT)
if! sema. tryAcquire(timeout=100ms) then return 429 with retry_after=rand(1..5)s process()
sema. release()
GraphQL 비용 절감 (아이디어):
pseudo cost = sum(weight(field) cardinality(arg))
if cost > tenant. budget then reject(429,"query too expensive")
8) 다른 채널에 대한 정책
REST
GET-더 부드럽고 POST/PATCH/DELETE-더 엄격합니다. "demempotent" 상태/점검을 철회 할 수 있습니다.
결제: 사용자/테넌트/BIN/국가 당 '지정/캡처/환불' 제한.
그래프 QL
깊이/복잡도 캡, 지속/백색 쿼리, 별칭 제한.
웹 소켓/SSE
주파수 제한 '구독/취소', 주제 수 제한, 이벤트 크기 제어 및 'policy _ inquease' 오버플로시 전송 대기열 →.
웹 후크
수신시 누출 버킷, 발신자 당 할당량, 데드 레터 대기열, 결정 론적 2xx/429.
9) 고객 피드백
제목과 함께 항상 명확한 429를 반환하십시오
'재생 후: <초>'
'X-RateLimit-Limit/Remaining/Reset'
할당량 - 코드 '쿼터 _ 초과' 및 계획 업그레이드 링크가있는 403.
문서: OpenAPI/SDL + "공정 사용" 페이지의 제한 사항.
10) 모니터링 및 대시 보드
메트릭:- 조회수 한도: '비율. 한계. 열쇠/라우트/테넌트가 맞았습니다.
- 대기 시간 p50/p95/p99, 오류율, 대기열 길이, 개방 회로.
- 공정한 공유: 최고 소비 세입자, "깡패 탐지기".
- 웹 후크: 수신/retrai, 드롭 레이트, 중간 지연.
- 429 전체 RPS의 1-3% (봇없이) 를 넘지 않습니다.
- p95 리미터 첨가제 가장자리 당 5-10 ms.
- 분해 복구 시간
sql
SELECT ts::date d, tenant, route,
SUM(hits) AS limit_hits,
SUM(total) AS total_calls,
SUM(hits)::decimal/NULLIF(SUM(total),0) AS hit_rate
FROM ratelimit_stats
GROUP BY 1,2,3
ORDER BY d DESC, hit_rate DESC;
11) 사건 플레이 북
폭풍 (업스트림 가을): 글로벌 스로틀 링을 켜고, 백오프, 오픈 회로 차단기, 타임 아웃 대신 "빠른 실수" 를 반환하십시오.
봇 공격/스크래핑: IP/ASN/geo의 하드 캡, WAF/JS 챌린지 가능, 디렉토리/검색 제한.
토너먼트/이벤트 피크: 선제 적으로 판독 한계를 높이고 "고가의 필드" 를 낮추면 캐시/비정규화가 가능합니다.
PSP의 웹 후크 추가: 임시 누출 버킷, 중요한 유형의 우선 순위 지정, 데드 레터 확장 및 재 트레이.
12) 테스트 및 UAT
하중: RPS 사다리, 정상의 비드 × 10.
공정성: 1 명의 "욕심 많은" 임차인의 에뮬레이션-전 세계 예산의 X% 를 넘지 않습니다.
분해: SLO 적응은 한계를 줄이고 복도에 p95를 유지합니다.
경계 사례: 창 변경 (min → chas), 시계 흔들기 (클럭 왜곡), Redis 스케일링/키 샤딩.
계약: 429 및 재시도 후 헤더가 있으며 SDK가 올바르게 백오프되었습니다.
13) 한계 저장
로컬 한계 (작은 클러스터) 에 대한 메모리 내.
배포를 위해 Redis/Memcashed (원자성을위한 Lua 스크립트).
해시에 의한 샤딩 키; 창 아래 TTL; 캐시 손실에 대한 백업 메트릭.
이념성: 리미터는 dempotent 반복 호출을 중단해서는 안됩니다 (요청 키로 설정).
14) 거버넌스
카탈로그 제한: 소유자는 누구이며 키/임계 값/배열입니다.
빠른 스위치 (위기 모드) 를위한 기능 플래그.
계약 할당량 변경에 대한 검증 정책 및 RFC 프로세스.
최적의 임계 값 선택에 대한 A/B 실험.
15) 반 패턴
"모든 API에 대한" 글로벌 한계.
고정 창 → "가장자리" 만 점프합니다.
피드백없이 제한하십시오 ('재시도 후 '/헤더 없음).
빠른 429/503 대신 조용한 타임 아웃.
임차인 당 공정 공유 부족-한 고객이 나머지를 교살합니다.
GraphQL/복잡성 검색 보호 기능이 없습니다.
동시 가드 → DB/PSP "진공 청소기" 의 제로.
16) 미니 치트 시트 선택
기본값은 테넌트 당 토큰 버킷 (속도 + 버스트) 입니다.
돈/보고서 별 인용문: 하루/월 슬라이딩 창.
많은 작업: 동시 제한 + 대기열.
GraphQL/계수: 복잡성 예산 + 지속적인 쿼리.
WS/웹 후크: 누출 버킷 + 후압.
차단: 동적 스로틀 링 + 회로 차단기 + 저하.
요약
로드 제어는 올바른 알고리즘 (버킷/창/경쟁력), 공정 제한 키, SLO 적응 및 투명한 피드백과 같은 다단계 분야입니다. 게이트웨이/메쉬/서비스로 제한을 봉제, 프로필 정책으로 GraphQL/WS/웹 후크 무장 및 관찰 가능성을 플레이 북과 연결함으로써 최고 이벤트 및 기타 사람들의 실패를 충돌, 지불 중단 및 전환 중단없이 통제 된 상황으로 전환합니다.