Replica ed eventual consistency
Replica ed eventual consistency
1) Perché eventual consistency
Quando il sistema è distribuito in zone/regioni, la scrittura sincrona offre latitudine elevata e scarsa disponibilità in caso di guasti di rete. Eventual consistency (CE) consente la risincronizzazione temporanea delle repliche per:- basso ritardo di scrittura (ricevimento locale),
- migliore disponibilità per le divise di rete,
- ridimensionamento orizzontale.
La chiave è la coerenza controllata e non controllata: l'utente vede dati «abbastanza recenti», gli invarianti del dominio vengono salvati, i conflitti vengono rilevati e risolti prevedibilmente.
2) Modelli di coerenza - che promettiamo al cliente
Strong: la lettura visualizza subito l'ultimo record.
Bounded stale/read-not-older-than (RNOT) - Lettura non più vecchia (LSN/versione/ora).
Causal: la relazione causa-effetto (A-B) viene mantenuta.
Read-Your-Writes - Il cliente vede le sue voci recenti.
Monotonic Reads - Ogni lettura successiva non si ritira indietro.
Sessione - Set di garanzie in una sessione.
Eventual: in assenza di nuovi record, tutte le repliche convergono.
Pratica: combinare Sessione + RNOT su percorsi critici e Avvenual su vetrine/cache.
3) Replica: meccanica e anti-entropy
Sincrone (quorum/RAFT) - La scrittura viene considerata corretta dopo la conferma dei nodi N; RPO minimo, sopra p99.
Asincrona: leader committente locale, distribuisce la rivista in seguito; bassa latitanza, RPO> 0.
Fisica (WAL/binlog) - Veloce, omogeneo.
Logico/CDC: flusso di modifiche a righe/eventi, routing flessibile, filtri.
Anti-entropy - Incroci periodici e riparazione (Murkle-alberi, confronto hash, sfondo re-sync).
4) Identificatori di versione e ordini di causalità
Versioni monouso: Increment/LSN/epoch; Semplice, ma non codifica il parallelismo.
Lamport timestamp: ordine parziale per orologio logico.
Vector clock - Rileva i rami paralleli e consente di rilevare gli update conflittuali (concurrent).
La logica «non prima di T» per l'ordine globale.
Raccomandazione: per CRDT/update in conflitto - vector clock; per «non più vecchio» - LSN/GTID.
5) Conflitti: individuazione e risoluzione
Situazioni tipiche: scrittura da due regioni allo stesso oggetto.
Strategie:1. Last-Write-Wins (LWW) per timbratura oraria/logica è semplice, ma può «perdere» gli update.
2. Funzioni Merge per logica di dominio:- i campi contatori vengono ripiegati (G-Counter/PN-Counter),
- molti si uniscono a «add-wins/remove-wins»,
- importi/bilanci - solo tramite registri transazionali, non tramite semplice LWW.
- 3. CRDT (tipi convergenti): G-Counter, OR-Set, LWW-Registrer, RGA per gli elenchi.
- 4. Trasformazioni operative (raramente per database, più frequentemente per editori).
- 5. Manual resolution: conflitto inbox, l'utente sceglie la versione corretta.
Regola: gli invarianti del dominio definiscono la strategia. Per i soldi/saldi - evitare LWW; utilizzare transazioni/eventi con compensazione.
6) Garanzie di record e idempotia
Le chiavi Idempotent sui comandi (payment, withdraw, create) sono sicure.
Deduplicazione su inbox e outbox per idampotenza/numero di serie.
Exactly-once non è raggiungibile senza precondizioni forti; praticare at-least-once + idampotenza.
Outbox/Inbox-Pattern: scrittura nel database e pubblicazione di un evento atomon (transazione locale), il destinatario elabora per idempotency-key.
7) Letture non più vecchie di X (RNOT)
Tecnici:- Gate LSN/GTID: il client invia una versione minima (dalla risposta di un record), il router/proxy indirizza alla replica che ha raggiunto LSN ≥ X, altrimenti al leader.
- Time-bound: «non più vecchio di 2 secondi» - semplice SLA senza versione.
- Sessione pinning - Dopo aver registrato N secondi, leggiamo solo il leader (Read-Your-Writes).
8) Flusso di modifiche e negoziazione della cache
CDC (Kafka/Pulsar) i consumatori (cache, indici, vetrine).
Disabilità cache: topic'invalidate: {ns}: {id} '; elaborazione idempotent.
Rebuild/Backfill - Sovrascrivere le proiezioni dal registro eventi durante la rassincrona.
9) Saghe e compensi (transazioni interserver)
Nel mondo CE, le operazioni a lunga vita sono suddivise in azioni di compensazione:- Il coordinatore richiama i passi e i loro compensi.
- Coreografia: i passi rispondono agli eventi e pubblicano i seguenti.
Invarianti (esempio): «Saldo ≥ 0» - Controllo ai limiti del passo + compensazione in caso di deviazione.
10) Multi-regione e divisioni di rete
Locale-write, async-replicato - Scrittura in una regione locale + spedizione in altre (CE).
Geo-fencing: dati «incollati» alla regione (bassa latitanza, meno conflitti).
Database di quorum (Raft) per i dati CC; cache/vetrina - PA/CE.
Split-brain roadmap: in caso di perdita di comunicazione, le regioni continuano a lavorare all'interno dei limiti di dominio (write fencing, quote), quindi a reconcile.
11) Osservabilità e SLO
Metriche:- Replica lag: tempo/distanza LSN/offset (p50/p95/p99).
- Staleness: percentuale di risposte superiore alla soglia (ad esempio> 2s o LSN
- Configurt rate: frequenza di conflitti e merge di successo.
- Tempo di fusione delle repliche dopo il picco.
- Riconcile backlog - Volume/tempo delle partiture ritardate.
- RPO/RTO per categoria di dati (COP/AP).
- Lega> target, conflitti crescenti, finestre di inappropriatezza lunghe.
12) Progettazione dello schema di dati sotto CE
Versione/vettore esplicito in ogni record (colonne «variante», «vc»).
Registri Append-only per invarianti critici (bilanci, addebiti).
Identificatori eventi (snowflake/ULID) per l'ordine e la deduplicazione.
I campi con natura commutativa (contatori, molteplici) sono candidati a CRDT.
Design API: PUT con if-match/etag, PATCH con precision.
13) Pattern di conservazione e lettura
Read model/CQRS: scrittura in «sorgente», lettura da proiezioni (può essere ritardato) mostra «aggiorna»...).
Percorsi Stale-OK (catalogo/nastro) vs Strict (portafoglio/limiti).
Sticky/Bounded-stale nella query (titolo «x-read-consistency»).
14) Assegno foglio di implementazione (0-45 giorni)
0-10 giorni
Categorizza i dati: CP critici (denaro, ordini) vs UE/stale-OK (cataloghi, indici di ricerca).
Definisci SLO stale (ad esempio, non più vecchio di 2s), lame di destinazione.
Abilita la versioning degli oggetti e idempotency-keys nell'API.
11-25 giorni
Implementare CDC e outbox/inbox, percorsi di disabilità della cache.
Aggiungi RNOT (gate LSN) e sessione pinning ai percorsi critici di scrittura.
Implementare almeno una strategia merge (LWW/CRDT/Dominio) e un registro dei conflitti.
26-45 giorni
Automatizza i rapporti anti-entropy e i report di stack.
Applica game-day: separazione della rete, scoppio dei conflitti, ripristino.
Visualizza su dashboard: lag, staleness, conflict rate, convergence.
15) Anti-pattern
LWW cieco per gli invarianti critici (perdita di denaro/punti).
L'assenza di idempotency è una ripresa delle operazioni ai retrai.
Il modello «forte» su tutte le code p99 eccessive e la fragilità in caso di guasti.
Nessuna garanzia RNOT/Sessione «lampeggia» e gli utenti «non vedono» i loro cambiamenti.
Risincronizzazione nascosta della cache e dell'origine (nessun CDC/invalidità).
La mancanza di uno strumento di recordcile/anti-entropy - i dati «a secoli» variano.
16) Metriche di maturità
Replica lag p95 target (ad esempio, 500 ms all'interno della regione, 2 interregioni s).
Staleness SLO esegue il 99% delle richieste su percorsi «rigorosi».
Conflict resolution success ≥ 99. 9%, tempo medio di risoluzione di 1 minuto
Conversion time dopo i picchi - minuti, non l'orologio.
Il 100% delle transazioni «in denaro» è coperto da chiavi idempotency e outbox/inbox.
17) Ricette (snippet)
If-Match/ETag (HTTP)
PUT /profile/42
If-Match: "v17"
Body: { "email": "new@example.com" }
Se la versione è cambiata - '412 Precision Failed', il cliente risolve il conflitto.
Query «non più vecchio di LSN» (pseudo)
x-min-lsn: 16/B373F8D8
Il router sceglie la replica dì replay _ lsn "x-min-lsn, altrimenti è il leader.
CRDT G-Counter (idea)
Ogni regione conserva il suo contatore; Totale: somma di tutti i componenti Replica - Operazione switch.
18) Conclusione
Avvenual consistency non è un compromesso di qualità, ma un contratto consapevole: da qualche parte paghiamo con freschezza per la velocità e la disponibilità, ma difendiamo gli invarianti critici con strategie e strumenti di dominio. Inserisci le versioni, idempotency, RNOT/Sessions Garanzie, CDC e anti-entropy, misuri lag/staleness/conflicts - e il tuo sistema distribuito sarà veloce, sostenibile e prevedibilmente convergente anche sotto guasti e picchi di carico.