Kształtowanie i przebieg ruchu
1) Dlaczego to wszystko
Kształtowanie i routing - podstawa zarządzanej dostępności i przewidywalnego opóźnienia:- Stabilność: nie dawaj „hałaśliwych sąsiadów” do punktacji kanałów.
- Sprawiedliwość: priorytety i kwoty między najemcami/klasami.
- Wydajność: wysyłamy żądanie do miejsca, gdzie jest przetwarzane szybciej/taniej.
- Kontrola zmian: uwolnienia kanarkowe/ważone bez ryzyka.
- Oszczędności: optymalizacja kosztów wyjścia/wyjścia i CDN-cache-hitrate.
2) Podstawowe pojęcia
2. 1 Kształtowanie ruchu vs policja
Kształtowanie - wyrównuje ruch poprzez buforowanie i wysyłanie pakietów w tempie docelowym (wygładzanie „wybuchów”).
Policja - „karze” ekscesy (kropla/oznakowanie) bez buforowania. Trudniejsze, ale tańsze.
2. 2 Klasy, kolejki i dyscypliny
Kolejki priorytetowe (PRIO), WFQ/DRR (sprawiedliwy przydział), HTB (kontyngenty hierarchiczne), CoDel/RED (kontrola bloku buforowego), ECN (brak sygnału zatorów).
Na L7 - „kolejki” w postaci limitów/połączeń/bajtów RPS i pul priorytetowych.
2. 3 Algorytmy ograniczające
Wiadro Token (n żetony dodane z szybkością r; żądanie „spędza” k żetony).
Nieszczelne wiadro (stały odpływ; dobre do wygładzania).
Globalne/lokalne limity: lokalne - szybkie, globalne - targi (Redis/etcd/per-najemca).
3) QoS na L3/L4
3. 1 DSCP/ToS i klasy usług
Pakiety etykiet według typu ruchu (interaktywny, backend RPC, zadania w tle).
W centrach danych negocjuj politykę DSCP z tkaniną/chmurą sieciową.
3. 2 Linux tc: HTB + fq_codel (miniaturka)
bash
Clearing tc qdisc del dev eth0 root 2 >/dev/null true
Корневая HTB с 1Gbit tc qdisc add dev eth0 root handle 1: htb default 30 tc class add dev eth0 parent 1: classid 1:1 htb rate 1gbit
Класс latency-critical 200Mbit tc class add dev eth0 parent 1:1 classid 1:10 htb rate 200mbit ceil 1gbit prio 0 tc qdisc add dev eth0 parent 1:10 handle 10: fq_codel
Класс background 100Mbit tc class add dev eth0 parent 1:1 classid 1:30 htb rate 100mbit ceil 1gbit prio 2 tc qdisc add dev eth0 parent 1:30 handle 30: fq_codel
3. 3 ECN/RED/BBR
ECN zmniejsza spadki w szczytach; RED/CoDel ogranicza buforowanie.
BBR (zamiast Cubic) często zmniejsza opóźnienia p99, zwłaszcza na szczycie WAN/ciężkich kolejek.
4) Routing L7 (HTTP/gRPC/WS)
4. 1 Kryteria routingu
Ścieżki/metody ('/api/v1/', 'POST'), nagłówki (wersja kliencka, flagi funkcji, nagłówek kanaryjski), pliki cookie (A/B, lepkie), znaczki JWT (lokator/rola), geo/ASN, okna czasowe, obciążenie (wykrywanie zewnętrzne).
Protokół: HTTP/2 (multipleksowanie), HTTP/3/QUIC (odporność na utratę pakietów), gRPC (strumienie bi-di), WebSocket (długotrwałe połączenia).
4. 2 Ważony podział/uwolnienia kanarkowe
Root 'v1: 95%', 'v2: 5%', automatyczny wzrost z „zielonymi” metrykami.
Odcięcia: błędy/opóźnienia/niezmienne w biznesie.
Wysłannik (szkic)
yaml route:
weighted_clusters:
clusters:
- name: svc-v1 weight: 95
- name: svc-v2 weight: 5
Istio
yaml apiVersion: networking. istio. io/v1beta1 kind: VirtualService spec:
hosts: ["svc"]
http:
- route:
- destination: { host: svc, subset: v1, weight: 95 }
- destination: { host: svc, subset: v2, weight: 5 }
4. 3 Sesje lepkie i konsekwentne hashing
Powinowactwo sesji przez identyfikator cookie/IP/JWT.
Konsekwentne hashing dla klastrów pamięci podręcznej, shardy usługi, bramki limitu stawki.
Nginx
nginx upstream api {
hash $cookie_user_id consistent;
server 10. 0. 0. 1;
server 10. 0. 0. 2;
}
4. 4 Trasa geo- i opóźnienia
GeoIP/ASN na krawędzi (CDN/krawędź) → najbliższy POP/region.
Świadomość opóźnienia: okresowe próbki zdrowia + pomiary RTT → ruch do „najszybszego” klastra.
4. 5 Wykrywanie zewnętrzne/łamanie obwodu
Wybicie „złych” przypadków: maksymalny procent wyrzutu, podstawowe błędy/opóźnienie.
Wyłącznik: granice połączeń/RPS/w kolejkach.
5) Kształtowanie ruchu na poziomie stos bramy/zacieru
5. 1 Ograniczenie stawki
Lokalne (per-pod): tanie, ale nie fair inter-repliki.
Globalny (Redis/etcd): ważność na najemcę/klucz API.
Politycy: na trasę, na metodę, na najemcę, wybuch.
Wysłannik RLS (szkic)
yaml typed_per_filter_config:
envoy. filters. http. ratelimit:
"@type": type. googleapis. com/envoy. extensions. filters. http. ratelimit. v3. RateLimit domain: "api"
rate_limit_service:
grpc_service: { envoy_grpc: { cluster_name: rate_limit_cluster } }
5. 2 Sprawiedliwość i priorytety
Pule priorytetowe są interaktywne> system> tło.
Równoważniki DRR/WFQ dla L7: kwoty/wagi na klienta/najemcę.
5. 3 Przeciążenie i ochrona
Załadunek: awaria/degradacja w przypadku przekroczenia budżetów.
Współzależność adaptacyjna: dynamika limitów od p50/p95/kolejka-len.
Backpressure po stronie serwera: 429/503 + Retry-After.
6) poziom eBPF i CNI
6. 1 Cyl/eBPF
Filtrowanie/routing w jądrze: mniej przełączników kontekstowych, cienkie zasady L3-L7.
Maglev hashing do stabilnej dystrybucji.
Programy eBPF dla per-pod QoS (haki TC/XDP).
6. 2 Polityka Calico/
polityki dostępu do L3/L4, podstawowe klasy priorytetowe, integracja z Kubernetes QoS (Guaranteed/Burstable/KeyEffort).
7) Bramki krawędzi/CDN i API
CDN: klucze pamięci podręcznej (zapytanie normalizacyjne/nagłówki), stale-while-revalidate, ochrona pochodzenia (limit szybkości/filtry bot).
Bramki API: uwierzytelnianie, kontyngenty/plany taryfowe (na konsumenta), ograniczenia SLA, routing geograficzny, wersja API.
WAF: filtrowanie na krawędzi, aby nie marnować procesora jądra.
8) Autobusy asynchroniczne/strumieniowe
Kafka/NATS/Pulsar: kontyngenty producenta/konsumenta, limit wielkości partii, ciśnienie wsteczne przez opóźnienie.
Routing zdarzeń: najemca/idempotency-key, migotanie przegród dla jednolitości.
Dokładnie raz „skuteczny raz”: producenci transakcji + siniaki idempotentne.
9) Timeouts, retreats, backoff
Terminy końcowe: klient <proxy <service (nie na odwrót).
Retrai: Ograniczona liczba z jitterized wykładnicze backoff, ale bez burz.
Idempotencja jest obowiązkowa w rekolekcjach; w przeciwnym razie - SAGA/rekompensata.
Żądania zabezpieczane/równoległe (ostrożność): poprawia p99, zwiększa ogólny ruch.
10) Obserwowalność i SLO
10. 1 Metryka
rate_limit_hits, requests_queued, shed_requests_total, latency_ms{p50,p95,p99}, error_ratio, retry_attempts, outlier_ejections, queue_time_ms.
10. 2 Odwzorowanie
Identyfikator korelacji skanowania; oznaczać przęsła z typ przyczyny: 'retry' shed 'przepustnica' kolejka '.
Linki do przekładek/zabezpieczeń w celu zrozumienia wpływu na podsystemy.
10. 3 Dzienniki/raporty
Podsumowanie kropli/przelewów/limitów, mapy ciepła na trasie.
Oddzielne panele dla wskaźnika uczciwości.
10. 4 przykłady SLO
"p99 ≤ 300 ms przy 95 procentowym obciążeniu; szopa ≤ 0. 1%; error_ratio ≤ 0. 5%».
„Co najmniej 95% kwoty jest gwarantowane klasie interaktywnej po przeciążeniu”.
11) Przykłady konfiguracji
11. 1 Nginx: limit szybkości + pęknięcie + podział kanaryjski
nginx map $http_x_canary $canary { default 0; 1 1; }
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
upstream api_v1 { server 10. 0. 0. 1; }
upstream api_v2 { server 10. 0. 0. 2; }
server {
location /api/ {
limit_req zone=perip burst=20 nodelay;
if ($canary) { proxy_pass http://api_v2; break; }
proxy_next_upstream error timeout http_502 http_503 http_504;
proxy_pass http://api_v1;
}
}
11. 2 Wysłannik: wyłącznik + wykrywanie zewnętrzne
yaml circuit_breakers:
thresholds:
- priority: DEFAULT max_connections: 1000 max_pending_requests: 500 max_requests: 2000 outlier_detection:
consecutive_5xx: 5 interval: 10s max_ejection_percent: 50 base_ejection_time: 30s
11. 3 Istio: najemca kwot (rezerwa na etykiecie)
yaml apiVersion: security. istio. io/v1 kind: AuthorizationPolicy spec:
selector: { matchLabels: { app: api } }
rules:
- when:
- key: request. headers[x-tenant]
values: ["gold"]
Next - RateLimitPolicy in the limit provider with a large quota pool for "gold."
11. 4 wskazówki Kubernetes QoS
Gwarantowane dla dna krytycznego (żądania = limity).
PodPriority & Preemption: Krytyczne dna spowoduje przesunięcie wąskich gardeł tła.
Topologia rozprzestrzenianie się ograniczeń: zagospodarowanie przestrzenne dla zrównoważonego rozwoju.
12) Anty-wzory
Globalny limit oczu → fałszywe 429/timeouts dla ważnych klientów.
Retrai bez jitter/idempotencja → burza.
Zamieszanie czasu (klient> serwer) → zamarza i „podwójna praca”.
Wspólne bufory/kolejki na prod i eksperymenty → zanieczyszczenie danych.
„Zawsze lepkie” bez zdrowego rozsądku → nierówne obciążenia/gorące węzły.
Wyłączone wykrywanie outlier → zgniła instancja psuje wskaźniki tygodnia.
13) Lista kontrolna wdrażania
- Ruch segmentowy: klasy/najemcy/trasy.
- Ustawić budżety docelowe na RPS/połączenia/bajty i p95/p99.
- Włącz limit szybkości (lokalny + globalny), wyłącznik, wykrywanie odstępstw.
- Skonfiguruj podział kanaryjski + auto rollback na metrykach.
- Rekordowe timeouts/retrays z wykładniczym backoff + jitter.
- Włączyć ECN/BBR (w stosownych przypadkach) i fq_codel/HTB do wyjścia.
- Poszczególne baseny/bufory/kolejki do cienia i eksperymentów.
- Deski rozdzielcze: mierniki granic, kolejek, opóźnień, uczciwości.
- SLO i runbook: shedding/rollback/enable criteria.
14) FAQ
P: Co wybrać: kształtowanie lub policja?
Odp.: Dla niestandardowych ścieżek - kształtowanie (anty-aliasing bez kropli). Dla klas usług „tło „/” luzem „- policja w celu ochrony przepływów krytycznych.
P: Jak uniknąć burz odwrotu?
Odp.: Jitterized backoff, limit prób, idempotencja, wiersze serwera 'Retry-After', globalne kwoty.
P: Lepki czy hashing?
Odp.: Sticky - gdy sesja jest potrzebna/pamięć podręczna jest lokalna dla użytkownika; hashing - gdy potrzebujesz jednolitości i stabilności odlotu.
P: Co daje HTTP/3/QUIC?
Odp.: Bez zamków TCP HOL, lepsza tolerancja strat, szybsze odzyskiwanie - znacznie zmniejsza ogony p99/p999.
15) Kwoty całkowite
Efektywne kształtowanie i routing L7 to spójny zestaw polityk: priorytety i kwoty, sprawiedliwa dystrybucja, bezpieczne limity i inteligentne trasy, poparte obserwowalnością i SLO. Stosując opisane praktyki (HTB/fq_codel/ECN na niższych poziomach i Envoy/Istio/Nginx/eBPF na górze), otrzymasz przewidywalne ogony opóźnienia, odporność na przeciążenie i kontrolowane, bezpieczne uwolnienia.