Architettura e sicurezza dell'evento Realthyme Fide
Il fido di eventi Real-Time è il «sistema circolatorio» dei prodotti con gymificazione, antifrode, trigger CRM e pagamenti. Affinché funzioni in modo prevedibile ai picchi, non duplichi premi e non muova dati, è necessaria un'architettura rigorosa, dai protocolli e pneumatici alla firma, all'idipotenza, al budget-caper e all'osservabilità.
1) Obiettivi e requisiti
Affidabilità: fornitura di eventi con lame minimo (p95 da 250 ms ingest, p95 da 1 a 2 dal consumatore).
Consegna: at-least-once trasporto + logica exactly-once attraverso idempotenza.
Ordine: ordinamento in chiave (solitamente «user _ id») con finestre di riordinamento.
Sicurezza: MTLS, HMAC/JWT, rotazione delle chiavi, protezione contro replay/duplicati, minimizzazione del PII.
Scala: sharding orizzontale, backpressure, rate limiting, DLQ/repliche.
Maneggevolezza: schema registry, versioning, migrazioni senza interruzioni.
Compilazione: controllo (WORM), gate RG/KYC, geo-policy, GDPR/Anonimizzazione.
2) Baseline (livello dopo livello)
1. Producers è un server di gioco, portafogli/pagamenti, KYC/AML, SDK client (web/iOS/Android).
2. API Gateway (Ingress): accezione, convalida dello schema, autenticazione, HMAC/MTLS, normalizzazione del tempo.
3. Queue/Stream: Kafka/Rabbit/Cloud Pub/Sub - Buffering, partizionamento per user _ id.
4. Stream Processor: normalizzatore, arricchimento, instradamento di argomenti, anormalia/bandiere antibotto, scrittura idipotente.
5. Consumers: Rule/Scoring, Reward Orchestrator, CRM/CDP connettori, antifrode, sink'e.
6. Storage - Eventi crudi (immutabili), vetrine, indice per l'idempotenza, controllo-registro.
7. Osservabilità: metriche, fogli, tracciati, alert; panics → DLQ.
8. Ammin Plane: schema registry, chiavi/segreti, RBAC/ABAC, phicheflagi, servizio di replica.
3) Protocolli di spedizione: quando usare
HTTP/JSON (server-to-server webhoop) è semplice, compatibile, è buono per i partner esterni. Aggiungi HMAC + idampotenza.
gRPC/Protobuf: ritardi bassi, diagrammi rigorosi, bidi-striam per i servizi interni.
WebSocket/SSE: push al cliente, abbonamenti UI a liderboard e progressi.
CDC/Kafka Connect: quando le sorgenti sono database/portafogli, non servizi aziendali.
Raccomandazione: perimetro esterno - HTTP + HMAC + MTLS; Dentro c'è un gRPC/Protobuf.
4) Modello di evento e convenzioni
json
{
"event_id": "e_01HF3Z8Z7Q8Q2K", "event_type": "bet", "schema_version": "1. 3. 0", "occurred_at": "2025-10-24T11:37:21Z", "ingested_at": "2025-10-24T11:37:21. 183Z", "key": { "user_id": "u_12345" }, "ctx": {
"session_id": "s_778", "platform": "ios", "geo": "TR", "device_fp": "fp_4a1..."
}, "payload": {
"game_id": "slot_wolf", "bet": 0. 5, "win": 1. 25, "currency": "EUR", "provider": "GameCo"
}, "sig": {
"algo": "HMAC-SHA256", "kid": "k_2025_10", "ts": 1730061441, "mac": "c7b7b3...f1"
}
}
Regole:
- Due orari sono «occurred _ at» (sorgente) e «ingested _ at» (gateway). Accettate una deriva di ore di © 300 s.
- La chiave di instradamento è ciò che definisce l'ordine (solitamente user _ id).
- PII solo in «ctx »/« payload» in base al principio di minimizzazione; per gli attributi sensibili - Tornizzazione.
5) Spedizione, ordine e idepotenza
I trasporti at-least-once possono essere duplicati e riordinati.
Logica exactly-once: mantenete la tabella di idempotenza con indice univoco per '(event _ id)' e/o '(user _ id, source _ seq)'; ripetizione - no-op.
SKETCH SQL:sql
CREATE TABLE event_log (
event_id TEXT PRIMARY KEY, user_id TEXT, event_type TEXT, occurred_at TIMESTAMPTZ, payload JSONB
);
-- inserimento con protezione da doppie
INSERT INTO event_log(event_id, user_id, event_type, occurred_at, payload)
VALUES (:event_id,:user_id,:event_type,:occurred_at,:payload)
ON CONFLICT (event_id) DO NOTHING;
Ordine: partizionamento del flusso in «user _ id» + reordering window 60-120 s nel processore. In seguito, gli eventi vengono inseriti nella funzione di correzione.
6) Backpressure e gestione dei picchi
Token-bucket rate limiting на ingress (per-IP, per-partner, per-key).
Circuito breaker: a 5xx dai consumatori interni, la degradazione (dropout degli eventi facoltativi, code aumentano gli intervalli retrai).
DLQ - Messaggi permanentemente errati (schema battuto, firma non valida, firma TTL superata).
Servizio Replay: Ripablish selettivo da DLQ a «event _ id »/intervallo di tempo.
7) Schemi e evoluzione: come non «rompere» il prato
Schema Registry: JSON Schema/Protobuf; Criteri di compatibilità: backward per i produttori, forward per i consumatori.
Versioning: 'schema _ version', 'maggiore', solo attraverso il phicheflag e il doppio record (dual-write).
Contratti: promozione del sistema dopo il periodo canarico e green metrics.
Esempio di regole di convalida YAML:yaml compatibility:
enforce: true mode: backward blocked_fields:
- payload. ssn
- payload. card_number required_fields:
- event_id
- event_type
- occurred_at
8) Modello di minacce e protezione
Minacce: cambio corpo, ripetizione (replay), fuoriuscita PII, compromissione chiave, schema-poisoning, DoS, MITM, firma-stripping.
Protezione:- MTLS sul perimetro: certificati client a breve scadenza, CRL/OCSP.
- Firma HMAC del corpo + «X-Timestamp» e TTL (© 300 c).
- JWT (client credentials/OAuth2) - Consente l'autorizzazione e le restrizioni scope.
- Rotazione chiavi (KMS): «kid» nell'intestazione; Piano di rotazione 30-90 giorni doppia verifica nella finestra di migrazione.
- Nonce/idampotenza: 'X-Richiest-ID' per le richieste collaterali (pagamenti, bonus); conserva per tempo TTL.
- Content-Type pinning, max body size, allow-list IP/ASN per le integrazioni critiche.
- Controllo WORM di tutti i raw payload in arrivo + intestazioni (memorizzazione invariata).
python body = request. raw_body ts = int(request. headers["X-Timestamp"])
assert abs(now() - ts) <= 300 # анти-replay kid = request. headers["X-Key-Id"]
secret = kms. fetch(kid)
mac = hmac_sha256(secret, body)
assert hmac_eq(mac, request. headers["X-Signature"])
9) Privacy, PII e RG/KYC
Minimizzazione: PI trasmettere al link-token (5-15 minuti) anziché in linea; Non è consentito modificare/anonimizzare in loghi crudi - Utilizzare i singoli storani PII.
Accesso: ABAC per attributi di giurisdizione e ruolo tutte le letture sono nel registro di controllo.
GDPR: esercitare il diritto di eliminazione tramite key-mapping per cancellare il PII senza interrompere i fatti degli eventi.
RG/KYC - Gli eventi che richiedono riconoscimenti preziosi vengono ignorati solo se il livello KYC valida e le bandiere RG «OK».
10) Osservabilità e SLO
SLO (esempio):- Ingest p95 250 ms; end-to-end p95 ≤ 2 с; rifiuto 0. 1 %/24 ore.
- Firma-errore (HMAC/JWT) ≤ 0. 02% del flusso totale.
- DLQ fill rate ≤ 0. 1%; «duplicati» dopo l'idepotenza di 0. 005%.
- RPS per origine, p50/p95 latency, 4xx/5xx, firme-errore, time-skew.
- Lag per partenze, riciclo/s, fill DLQ, retries, repliche-volume.
- Schemi: numero di messaggi di versione, interruzioni di compatibilità.
- Sicurezza: frequenza rps-throttle, circuito-breakers, anomalie IP/ASN.
- flusso SRM (distorsione brusca del traffico da un'unica origine).
- Latenza p95> obiettivo 5 min +, crescita DLQ> X/min.
- Firme-errore> Y ppm, aumento di ripetizione «X-Sollest-Id».
- Drift ore> 120 da sorgente.
11) Multi-regione e disponibilità
Le regioni Active-Active, routing globale ( ), sticky-key a user _ id "regione.
Topic di replica crociata regionale per eventi critici (moneta, KYC).
Blast radius - Isolamento per tenenti/marchi, budget e chiavi separati.
Piano DR: RPO 5 min, RTO 30 min; Prove regolari.
12) Regole di retino e replica
Eventi crudi: 7-30 giorni (a costo), unità/vetrine più a lungo.
Le repliche sono consentite solo con runbook firmato (chi, cosa, perché, intervallo di tempo).
Le repliche vanno sempre alla nuova versione stream con la bandiera «replayed = true» per la trasparenza analitica.
13) Esempi di configurazione
Ingress (stile NGINX) limiti:nginx limit_req_zone $binary_remote_addr zone=req_limit:10m rate=300r/s;
limit_req zone=req_limit burst=600 nodelay;
client_max_body_size 512k;
proxy_read_timeout 5s;
Kafka (esempio):
properties num. partitions=64 min. insync. replicas=2 acks=all retention. ms=604800000 # 7 days compression. type=zstd
Policy per chiavi (KMS):
yaml rotation_days: 45 grace_period_days: 7 allow_algos: ["HMAC-SHA256"]
key_scopes:
- topic: "wallet_events"
producers: ["wallet-svc"]
consumers: ["ledger-svc","risk-svc"]
14) Assegno fide di avvio real-time
- MTLS sul perimetro, HMAC/JWT, rotazione chiavi ('kid').
- Idempotenza su logica (chiavi uniche, upsert/ON CONFLICT).
- Partizionamento per user _ id, reordering window, servizio di replica.
- Schema registry + criteri di compatibilità dual-write a major-update.
- Rate limiting, circuito breakers, DLQ + gelosia manuale.
- Osservabilità: SLO, alert firma/latitanza/DLQ/lag.
- Criteri PII/Anonimizzazione, ABAC, controllo WORM.
- DR/multi-regione, prove di feelover.
- Runbooks: incidenti, repliche, ripristinare schemi/chiavi.
15) Mini valigetta (sintetico)
Contesto: picco di tornei, 120 a RPS ingress, 64 partenze, 2 regioni Active-Active.
Totale di 4 settimane: ingest p95 210 ms, e2e p95 1. 6 c; DLQ 0. 05%; firme-errore 0. 009%; duplicati dopo idempotenza 0. 003%.
L'incidente è che la deriva dell'orologio del partner (- 9 min) ha avuto un picco anti-replay. Il circuito breaker ha trasferito il flusso in un endpoint «buffer», il partner-health ha informato il CSM; Dopo il NTP, repliche della finestra 12 min a tutti i concimatori. Non ci sono perdite o doppi pagamenti.
16) Riepilogo
Un fido reale-time affidabile non è «solo webhook». Questo è un sistema a strati con contratti chiari: trasporto at-least-once + logica exactly-once, diagrammi di registro e versioning, MTLS/HMAC/JWT e rotazione chiavi, backpressure/DLQ/repliche, minimizzazione PII e controllo rigoroso. Seguendo queste pratiche, si otterrà un flusso rapido, sicuro e prevedibile di eventi su cui è possibile costruire in modo sicuro gaming, antifrode, CRM e pagamenti.