GH GambleHub

Replikation und Eventual Consistency

Replikation und Eventual Consistency

1) Warum eventual consistency

Wenn das System über Zonen/Regionen verteilt ist, führt die synchrone Aufzeichnung überall zu hoher Latenz und geringer Verfügbarkeit bei Netzwerkausfällen. Eventual consistency (EC) erlaubt eine vorübergehende Nicht-Synchronisation von Replikaten aus folgenden Gründen:
  • geringe Aufzeichnungsverzögerung (lokaler Empfang),
  • bessere Zugänglichkeit bei Netzteilen,
  • horizontale Skalierung.

Die Kernaufgabe ist die kontrollierte lasche Konsistenz: Der Nutzer sieht „ausreichend frische“ Daten, Domain-Invarianten bleiben erhalten, Konflikte werden erkannt und vorhersehbar gelöst.

2) Konsistenzmodelle - Was wir dem Kunden versprechen

Stark: Das Lesen sieht sofort den letzten Eintrag.
Bounded stale/read-not-older-than (RNOT): Lesen ist nicht älter als die Marke (LSN/Version/Zeit).
Causal: „Ursache-Wirkungs“ -Beziehungen werden beibehalten (A bis B).
Read-Your-Writes: Der Kunde sieht seine letzten Einträge.
Monotonische Lesungen: Jede nächste Lesung wird nicht „zurückgerollt“.
Sitzung: eine Reihe von Garantien innerhalb einer Sitzung.
Eventual: Wenn keine neuen Einträge vorhanden sind, laufen alle Replikate zusammen.

Praxis: Kombinieren Sie Session + RNOT auf kritischen Pfaden und Eventual auf Vitrinen/Caches.

3) Replikation: Mechanik und Anti-Entropy

Synchron (Quorum/RAFT): Die Aufzeichnung gilt nach Bestätigung durch N Knoten als erfolgreich; Mindestrpo, über p99.
Asynchron: der Führer commitit lokal, verteilt das Protokoll später; niedrige Latenz, RPO> 0.
Physikalisch (WAL/binlog): schnell, homogen.
Logisch/CDC: Änderungsfluss auf Zeilen-/Ereignisebene, flexibles Routing, Filter.
Anti-Entropy: periodische Abstimmungen und Reparaturen (Merkle-Bäume, Hash-Vergleich, Hintergrund-Re-Sync).

4) Versionskennungen und Kausalitätsaufträge

Monotone Versionen: increment/LSN/epoch; einfach, aber nicht kodieren Parallelität.
Lamport Timestamp: Teilreihenfolge nach logischer Uhr.
Vektoruhr: Erfasst parallele Zweige und ermöglicht die Erkennung von Konfliktupdates (concurrent).
Hybrid/TrueTime/Clock-SI: Logik „nicht vor T“ für die globale Ordnung.

Empfehlung: für CRDT/Konflikt-Updates - Vektoruhr; für „nicht älter“ - LSN/GTID.

5) Konflikte: Entdeckung und Lösung

Typische Situationen: Schreiben von zwei Regionen in das gleiche Objekt.

Strategien:

1. Last-Write-Wins (LWW) nach Stunden-/Logikstempel - einfach, kann aber Upgrades „verlieren“.

2. Merge-Funktionen nach Domänenlogik:
  • Zählfelder addieren sich (G-Counter/PN-Counter),
  • Mengen werden mit „add-wins/remove-wins“ kombiniert,
  • Beträge/Salden - nur über Transaktionsprotokolle, nicht über eine einfache LWW.
  • 3. CRDT (Converged Types): G-Counter, OR-Set, LWW-Register, RGA für Listen.
  • 4. Operative Transformationen (selten für DB, häufiger für Redakteure).
  • 5. Manuelle Lösung: Konflikt in „inbox“, der Benutzer wählt die richtige Version.

Regel: Domain-Invarianten diktieren die Strategie. Für Geld/Guthaben - vermeiden Sie LWW; Transaktionen/Ereignisse mit Kompensation verwenden.

6) Datensatzgarantien und Idempotenz

Idempotente Schlüssel auf Befehlen (payment, withdraw, create) → Wiederholung ist sicher.
Deduplizierung am „Eingang“ (inbox) und „Ausgang“ (outbox) nach idempotence key/serial number.
Exactly-once ist ohne starke Voraussetzungen unerreichbar; üben Sie at-least-once + idempotence.
Outbox/Inbox-Muster: Eintrag in die DB und Veröffentlichung des Ereignisses ist atomar (lokale Transaktion), der Empfänger verarbeitet per idempotency-key.

7) Lesungen „nicht älter als X“ (RNOT)

Techniker:
  • LSN/GTID-Gate: Der Client überträgt die Mindestversion (aus der Schreibantwort), der Router/Proxy sendet an das Replikat, das LSN ≥ X eingeholt hat, andernfalls an den Leader.
  • Time-bound: „werde nicht älter 2 Sekunden“ ist ein einfaches SLA ohne Versionen.
  • Session-Pinning: Nach der Aufzeichnung von N Sekunden lesen wir nur den Leader (Read-Your-Writes).

8) Änderungsflüsse und Cacheaushandlung

CDC → Ereignisbus (Kafka/Pulsar) → Verbraucher (Caches, Indizes, Schaufenster).
Behinderung durch Caches: topics' invalidate: {ns}: {id}'; idempotent Verarbeitung.
Rebuild/Backfill: Wenn Sie nicht synchron sind, erstellen Sie Projektionen aus dem Ereignisprotokoll neu.

9) Sagas und Vergütungen (serviceübergreifende Transaktionen)

In der EC-Welt werden langlebige Operationen in Schritte mit Ausgleichsmaßnahmen unterteilt:
  • Orchestrierung: Der Koordinator ruft die Schritte und deren Kompensation auf.
  • Choreografie: Schritte reagieren auf Ereignisse und veröffentlichen die nächsten selbst.

Invarianten (Beispiel): „Balance ≥ 0“ - Überprüfung an den Schrittgrenzen + Kompensation bei Abweichung.

10) Multi-Region und Netzwerk-Splits

Local-write, async-replicate: Eintrag in der lokalen Region + Lieferung an andere (EC).
Geo-Fencing: Daten werden an die Region „geklebt“ (geringe Latenz, weniger Konflikte).
Quorum-DBs (Raft) für CP-Daten; Caches/Schaufenster - AP/EC.
Split-Brain-Plan: Wenn die Verbindung verloren geht, arbeiten die Regionen weiterhin innerhalb der Domänenlimits (Schreibfencing, Quoten), dann - reconcile.

11) Beobachtbarkeit und SLO

Metriken:
  • Replica lag: time/LSN-distance/offset (p50/p95/p99).
  • Staleness: Anteil der Antworten, die älter als die Schwelle sind (z.B.> 2s oder LSN
  • Konfliktrate: Häufigkeit von Konflikten und erfolgreichen Zusammenschlüssen.
  • Convergence time: Die Konvergenzzeit der Replikate nach dem Peak.
  • Reconcile backlog: Volumen/Zeit der Nachzügler.
  • RPO/RTO nach Datenkategorie (CP/AP).
Alerts:
  • Lag> Ziel, wachsende Konflikte, „lange“ Fenster der Unvereinbarkeit.

12) Design des Datenschemas unter EC

Explizite Version/Vektor in jedem Datensatz (Spalten 'version', 'vc').
Nur Append-Protokolle für kritische Invarianten (Salden, Gebühren).
Ereignis-IDs (snowflake/ULIDs) für Reihenfolge und Deduplizierung.
Felder mit kommutativer Natur (Zähler, Menge) → Kandidaten für CRDT.
API-Design: PUT mit if-match/etag, PATCH mit Precondition.

13) Speicher- und Lesemuster

Read model/CQRS: Schreiben in die „Quelle“, Lesen aus Projektionen (kann zurückbleiben → Anzeige „aktualisiert“...).
Stale-OK Routen (Verzeichnis/Band) vs Strict (Wallet/Limits).
Sticky/Bounded-stale Flags in der Abfrage (Überschrift „x-read-consistency“).

14) Implementierung Checkliste (0-45 Tage)

0-10 Tage

Kategorisieren Sie die Daten: CP-kritisch (Geld, Aufträge) vs EU/stale-OK (Kataloge, Suchindizes).
Bestimmen Sie den SLO des Steals (z. B. „nicht älter als 2s“), die Zielverzögerungen.
Aktivieren Sie Objektversionierung und idempotency-keys in der API.

11-25 Tage

Implementieren Sie CDC und Outbox/Inbox, Cache-Invaliditätsrouten.
Fügen Sie RNOT (LSN-Gate) und Session-Pinning zu den schreibkritischen Pfaden hinzu.
Implementieren Sie mindestens eine Merge-Strategie (LWW/CRDT/Domain) und ein Konfliktprotokoll.

26-45 Tage

Automatisieren Sie Anti-Entropy (Abstimmungen/Reparaturen) und Steyling-Berichte.
Halten Sie einen Spieletag: Trennung des Netzwerks, Ausbruch von Konflikten, Erholung.
Visualisieren Sie auf Dashboards: lag, staleness, conflict rate, convergence.

15) Anti-Muster

Blind LWW für kritische Invarianten (Verlust von Geld/Punkten).
Das Fehlen von idempotency → doppelte Operationen bei Retrays.
Das „starke“ Modell → übermäßige p99-Schwänze und Zerbrechlichkeit bei Ausfällen.
Es gibt keine RNOT/Session-Garantien → UX „blinkt“, Benutzer „sehen“ ihre Änderungen nicht.
Versteckte Nicht-Synchronisation von Cache und Quelle (keine CDC/Behinderung).
Das Fehlen des Tools reconcile/anti-entropy - die Daten „seit Jahrhunderten“ gehen auseinander.

16) Reifegradkennzahlen

Replica lag p95 ≤ Ziel (z. B. ≤ 500 ms innerhalb einer Region ≤ 2 s Interregionen).
Staleness SLO erfüllt ≥ 99% der Anfragen auf „strengen“ Routen.
Conflict resolution success ≥ 99. 9%, durchschnittliche Auflösungszeit ≤ 1 min.
Convergence Zeit nach Spitzen - Minuten, nicht Stunden.
100% der „monetären“ Transaktionen werden mit idempotency-Schlüsseln und outbox/inbox abgedeckt.

17) Rezepte (Schnipsel)

If-Match/ETag (HTTP)


PUT /profile/42
If-Match: "v17"
Body: { "email": "new@example. com" }

Wenn die Version geändert wurde - „412 Precondition Failed“ → löst der Client den Konflikt.

Abfrage „nicht älter als LSN“ (Pseudo)


x-min-lsn: 16/B373F8D8

Der Router wählt ein Replikat mit 'replay _ lsn ≥ x-min-lsn', ansonsten - der Führer.

CRDT G-Counter (Idee)

Jede Region speichert ihren Zähler; das Ergebnis ist die Summe aller Komponenten; Replikation - Der Vorgang ist kommutativ.

18) Schlussfolgerung

Eventual consistency ist kein Kompromiss aus Qualität, sondern ein bewusster Vertrag: Irgendwo zahlen wir Frische für Geschwindigkeit und Verfügbarkeit, aber wir schützen kritische Invarianten mit Domain-Strategien und Tools. Geben Sie die Versionen, idempotency, RNOT/Session Garantie, CDC und Anti-Entropy, messen lag/staleness/Konflikte - und Ihr verteiltes System wird schnell, stabil und vorhersehbar konvergieren auch unter Ausfällen und Spitzenlasten.

Contact

Kontakt aufnehmen

Kontaktieren Sie uns bei Fragen oder Support.Wir helfen Ihnen jederzeit gerne!

Telegram
@Gamble_GC
Integration starten

Email ist erforderlich. Telegram oder WhatsApp – optional.

Ihr Name optional
Email optional
Betreff optional
Nachricht optional
Telegram optional
@
Wenn Sie Telegram angeben – antworten wir zusätzlich dort.
WhatsApp optional
Format: +Ländercode und Nummer (z. B. +49XXXXXXXXX).

Mit dem Klicken des Buttons stimmen Sie der Datenverarbeitung zu.