Bilanciamento del carico
1) Perché e dove è nell'architettura
Il bilanciatore è un tornello tra il cliente e il parco backend. I suoi obiettivi:- disponibilità (senza un unico punto di guasto), latitudine (p95), scala (orizzontale), sicurezza (TLS/WAF), gestione dei lanci (canary/blue-green).
- Edge/Global: Anycast, GSLB/GeoDNS, CDN/Edge-LB, DDoS.
- L4 (TCP/UDP) - NLB, maglie, proxy senza terminazione.
- L7 (HTTP/2, gRPC, WebSocket, QUIC): instradamento su percorsi/intestazioni/marchi, cash/compressione/retrai.
- Data-tier: DB-прокси (PgBouncer/ProxySQL), Redis Cluster/Consistent Hash, Kafka partitioning.
2) Modelli e algoritmi di bilanciamento
Round-Robin (RR) - Semplice.
Least Connection (LC) - Ottimo per i connettori di lunga durata (WS, gRPC).
Least Sollest/Power-of-Two (P2C) - Confronto tra due casuali - buon equilibrio velocità/qualità.
Weighted RR/LC: pesi per canary/nodi hot.
Consistent Hacing (CH) - Appiccicatura di sessione senza tabella (cart, redis).
Maglev/Flow-hash: distribuzione rapida L3/L4 con resistenza al flapping.
Latency-aware - Scelta su p50/p95 scorrevole.
EWMA - Tiene conto della cronologia dei ritardi.
Raccomandazione: per default P2C (least-sollest) su L7; per stateful/cache - consistent hash; для WS/gRPC — least-connections.
3) Salute degli upstream: controlli e «sfratti»
Health-checks: TCP, HTTP 200/匹配 тела, gRPC status; intervalli/timeout/soglia di errore.
Outler Ejection - Consente di escludere automaticamente le istanze «rumorose» (consortive-5xx, success-rate-ejection).
Slow-start & warmup: immissione morbida di nuove istanze (aumento graduale del peso).
Connection draining - In caso di impollinazione/depistaggio - «dolcezza» dei connettori attivi senza dirupo.
4) Sessioni e appiccicosità (stickansa)
Cookie-stickiness (L7): `Set-Cookie: lb=<id>; SameSite; Secure`.
La chiave CH è «hash».
IP-hash - Solo in reti chiuse (NAT rompe).
TTL di appiccicosità + fallback quando si evicchia il naso.
L'importante è ridurre al minimo la necessità di appiccicosità e mantenere lo stato fuori dall'istanza (Redis/DB/JWT).
5) Bilanciamento globale (GTM/GSLB)
Anycast + health-probe: un IP, traffico verso il PoP più vicino; Un feelover automatico.
Risposta per geo/ritardo.
Cluster regionali: i dati residenti rimangono nella regione (GDPR); failover interregionale con replica.
Criteri: geo-blocchi, adesione account/token.
6) Protocolli e caratteristiche
HTTP/2: multiplex, priorità; ha bisogno di una connessione-pool corretta per l'upstream.
: strike a lunga vita, least-connection, health-checks aggressivi.
WebSocket/SSE: adesività, grandi idle-timeout, TCP keep-alive.
QUIC/HTTP/3: avvio rapido, resistenza alla perdita; tieni d'occhio l'MTU/path-MTU.
TLS-termination/mTLS: terminare su edge/L7-LB; dentro - SPIFFE.
7) Protezione da sovraccarico (overload control)
Rate-limit: per-IP, per-key, per-route; burst+sustain.
Adattative Concerty (Invoy) - Limite dinamico delle query simultanee.
Queue/Surface-buffer: dimensioni della coda limitate con un errore onesto di 503.
Hedging/Parallel racing - Duplicazione di query lente (solo idipotenti).
Timeout budget: connect/read/write separati.
Backpressure: '503 + Retry-After', retrai esponenziali client con jitter.
Protezione slow-loris: timeout lettura/scrittura, velocità minima.
8) Release e gestione del traffico
Canary (weighted): 1–5–10–25–50–100% с guardrails (p95, 5xx, timeouts).
Blue-Green: maglioncino istantaneo, ritorno - DNS/LB.
Shadow/Mirror - Copia delle query senza effetto sulla risposta; maschera PII.
Header/Claim-routing: `X-Canary: 1` или `JWT. claims. region/role`.
9) Scale automatico e drenaggio
HPA/ASG по CPU+RPS+p95+queue-depth.
PreStop hook, aspettare che i connettori finiscano.
Warm pool/instance reuse: riduce le partenze fredde.
Capacity planning: destinazione «utilization 60-70%» a p95 normale.
10) Osservabilità e SLO
Metriche LB: RPS, p50/p95/p99, 4xx/5xx, open-connection, queue-len, ejeziones, retries, hit-ratio cache.
Tracing: 'traceparent/x-sollest-id', attraverso i servizi LB del database.
Loghi: strutturali, maschere PII/PAN, corellazione con upstream.
Ad esempio, «latency p95 300 ms», «availability» 99. 9%`, `5xx ≤ 0. 5%`.
Alert: in base alle anomalie (burn-rate SLO, espansione ejection, altezza 5xx/timeout).
11) Bilanciamento dati e cache
PostgreSQL/MySQL:- Read/Write split (ProxySQL/pgpool) + read-replicas; sticky-txn.
- Failover replica sincrona per RPO = 0 (più costoso).
- Redis Cluster + hash-slot; per le sessioni - CH; timeout/Retryable errors.
- Bilanciamento tramite partitioning e consumer-groups; non confondere HTTP-LB.
- Object Storage (S3/MinIO): multi-region failover через GSLB/replication.
12) K8s e LB cloud
Servizio (ClusterIP/NodePort/LoadBalancer) - L4 base.
Ingress/Gateway API - Routing L7, pesi canari, TLS.
AWS: NLB (L4, banda alta), ALB (L7, WAF, sticky, header-routing).
GCP: Global LB (L7/HTTP(S) с Anycast), TCP/UDP proxy LB.
Azure: Front Door (global), Application Gateway (L7), Load Balancer (L4).
13) Esempi di configurazione
13. 1 NGINX (L7, least_conn, sticky, canary)
nginx upstream api_pool {
least_conn;
server api-1:8080 max_fails=3 fail_timeout=10s;
server api-2:8080 max_fails=3 fail_timeout=10s;
sticky cookie lb_id expires=30m path=/ secure httponly;
}
map $http_x_canary $dst {
default api_pool;
1 canary_pool;
}
upstream canary_pool {
least_conn;
server api-canary:8080 weight=1;
}
server {
listen 443 ssl http2;
location /api/ {
proxy_read_timeout 5s;
proxy_connect_timeout 1s;
proxy_set_header X-Request-Id $request_id;
proxy_pass http://$dst;
}
}
13. 2 HAProxy (P2C, health, slowstart, stick-table)
haproxy backend api balance leastconn option httpchk GET /health default-server inter 3s fall 3 rise 2 slowstart 10s server s1 10. 0. 0. 11:8080 check server s2 10. 0. 0. 12:8080 check stick-table type ip size 100k expire 30m http-request track-sc0 src rate limit per IP http-request deny deny_status 429 if { sc_http_req_rate(0) gt 50 }
13. 3 Envoy (P2C, outlier, retries, adaptive concurrency)
yaml load_assignment: {... }
lb_policy: LEAST_REQUEST least_request_lb_config: { choice_count: 2 }
outlier_detection:
consecutive_5xx: 5 interval: 5s base_ejection_time: 30s typed_extension_protocol_options:
envoy. extensions. filters. http. adaptive_concurrency. v3. AdaptiveConcurrency:
gradient_controller_config:
sample_aggregate_percentile: PERCENTILE_50 retry_policy:
retry_on: "5xx,reset,connect-failure"
num_retries: 2 per_try_timeout: 1s
13. 4 Kubernetes (Gateway API, weighted canary)
yaml apiVersion: gateway. networking. k8s. io/v1 kind: HTTPRoute spec:
rules:
- matches: [{ path: { type: PathPrefix, value: /api }}]
backendRefs:
- name: api-v1 weight: 90 port: 8080
- name: api-v2-canary weight: 10 port: 8080
14) Assegno fogli
Prima del rilascio LB/percorso
- L'algoritmo è selezionato (P2C/LC/CH) sotto il tipo di traffico.
- Health-checks e soglie di ejection sono configurati.
- Slow-start, warmup, connection-drain sono abilitati.
- TLS/mTLS, HSTS, codici sicuri; HTTP/2/3 se necessario.
- Sticky/CH solo se necessario; TTL и fallback.
- Rate-limit/burst, timeouts, retry-budget, adaptive concurrency.
- Logi/roulotte: 'trace-id'; maschera PII.
- SLO/alert da p95/5xx/elettricità/queue-len.
- Pesi canari + piano di rientro; shadow a grandi modifiche.
Per le rotte di pagamento/compilazione
- Idempotenza POST (Idempotency-Key).
- Failover tra PSP; convalida same-method.
- Codici di errore normalizzati; ETA/motivi per cliente.
Per database/cache
- RW-split/repliche timeout, retry di rete.
- CH/slot-hash per Redis; Protezione contro le chiavi calde.
- Monitoraggio dei ritardi e replication-lag.
15) Metriche di qualità (minimo)
Latency p50/p95/p99 attraverso percorsi/metodi.
Error rate 4xx/5xx, timeout/overflow.
Open/active connections, queue depth, retry count.
Outler ejections e motivi.
Sticky hit-ratio / cache hit-ratio.
GSLB: distribuzione regionale, feelover, disponibilità di PoP.
16) Anti-pattern
Un LB monolitico senza ridondanza.
Sessione Sticky «a tutto», invece di estirpare lo stato.
Code infinite globali (nascondono il problema, crescono p99).
I retrai senza jitter/budget sono una tempesta di richieste.
Confidenza'X-Forwarded-For ', senza l'elenco dei proxy affidabili.
L'assenza di drain nei depositi è ata.
Non tiene conto dei connettori long-lived per lo skale automatico.
17) iGaming-specificità
Picchi e tornei: micro-cache su guide/listini (1-5 c), auto-scale a turno.
Giochi Live/striam: LC per i connettori di lunga durata, priorità per i prossimi PoP.
Pagamenti: routing geo/valuta/importo/provider; timeout rigoroso e idimpotenza.
Gioco responsabile e compilation: la priorità è ignorare le richieste di limiti/blocchi, anche in caso di degrado (fail-open/close policy).
18) Processo di implementazione (4 sprint)
1. Mappe del traffico: protocolli, carichi p95/p99, percorsi critici.
2. Configurazione LB: algoritmi, health/outlier, TLS, limiti/timeout, osservabilità.
3. GSLB/Edge: Anycast/GeoDNS, PoP-Heights, regole dei dati regionali.
4. Strategia di rilascio: canary/shadow, SLO-alert, auto-scale + drain, analisi post-incidente.
Scorciatoia finale
Selezionare l'algoritmo sotto il tipo di traffico (P2C/LC/CH) e la durata del connettivo.
Tenete gli upstream sani: health-checks + outlier + slow-start + drain.
Controllo del carico di picco: rate-limit, adattative concertency, code con guasto.
Utilizzare GSLB/Anycast per la disponibilità globale e la compilazione per regione.
Osservabilità e SLO sono obbligatori; release - tramite canary/shadow con piano di rimborso.
Se possibile, togliete la sessione dalle istanze e l'appiccicosità da LB.