GH GambleHub

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).
Alert:
  • 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.

Contact

Mettiti in contatto

Scrivici per qualsiasi domanda o richiesta di supporto.Siamo sempre pronti ad aiutarti!

Avvia integrazione

L’Email è obbligatoria. Telegram o WhatsApp — opzionali.

Il tuo nome opzionale
Email opzionale
Oggetto opzionale
Messaggio opzionale
Telegram opzionale
@
Se indichi Telegram — ti risponderemo anche lì, oltre che via Email.
WhatsApp opzionale
Formato: +prefisso internazionale e numero (ad es. +39XXXXXXXXX).

Cliccando sul pulsante, acconsenti al trattamento dei dati.