Was eine Leserin nach dem Schreiben sieht
Konsistenz beschreibt, was eine lesende Person sieht, nachdem jemand Daten geändert hat. Bei starker Konsistenz sieht sie immer den neuesten Stand, bei letztendlicher Konsistenz erst nach einer kurzen Zeit.
Eva überweist 20 Euro und lädt ihre Kontoseite neu. Zeigt eine Kopie noch den alten Stand, glaubt Eva, das Geld sei nicht abgebucht worden.
Am Ende dieser Lektion
Notiz
Ich kann sagen, was eine lesende Person nach einem Schreibvorgang sieht und welchen Kompromiss das bedeutet.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Konsistenz | ob alle Lesenden denselben Stand sehen |
| Starke Konsistenz | jeder Lesevorgang liefert den neuesten Stand |
| Letztendliche Konsistenz | alle Kopien gleichen sich mit der Zeit an (Eventual Consistency) |
| Veralteter Stand | ein Wert, der schon überholt ist (Stale Read) |
| Kompromiss | man gewinnt etwas und gibt etwas anderes auf |
| Netzwerkpartition | das Netz zerfällt in Teile, die sich nicht erreichen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Starke Konsistenz liefert immer den neuesten Stand
Bei starker Konsistenz liefert jeder Lesevorgang das Ergebnis des letzten Schreibvorgangs. Das System verhält sich, als gäbe es nur eine Kopie.
Der Preis: Ein Schreibvorgang gilt erst als fertig, wenn die Kopien ihn haben. Das dauert länger, und bei einem Netzproblem muss das System warten.
Einen kleinen Client namens v bauen
v() ( printf '%s\r\n' "$*" | nc -w 1 valkey 6379 )Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Kontostand von Eva speichern
v SET kontostand:eva 100Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Stand nach der Überweisung speichern
v SET kontostand:eva 80Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ihn sofort wieder lesen
v GET kontostand:evaHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Letztendliche Konsistenz erlaubt kurz alte Werte
Bei letztendlicher Konsistenz antwortet jede Kopie sofort. Das Replikat kann kurz einen veralteten Stand liefern. Hören die Schreibvorgänge auf, gleichen sich alle Kopien an.
Der Gewinn: Das System bleibt schnell und antwortet auch dann, wenn ein Teil des Netzes fehlt.
Beispiel: Primärknoten und Replikat im Zeitverlauf
| Zeit | Ereignis | Primärknoten | Replikat |
|---|---|---|---|
| 9 | Ausgangsstand | 100 | 100 |
| 10 | Eva schreibt 80 | 80 | 100 |
| 11 | Lesevorgang beim Replikat | 80 | 100 (veraltet) |
| 13 | Replikat hat nachgespielt | 80 | 80 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Wann das Replikat noch veraltet ist
# Ein Schreibvorgang kommt um Zeitpunkt 10 an. Das Replikat bekommt ihn 3 Einheiten später.
schreibzeit = 10
verzoegerung = 3
for lesezeit in [10, 12, 13]:
if lesezeit >= schreibzeit + verzoegerung:
print("Zeit", lesezeit, "Replikat liefert 80, den neuen Stand")
else:
print("Zeit", lesezeit, "Replikat liefert 100, einen veralteten Stand")
# Setzen Sie verzoegerung auf 0 und starten Sie erneut.
Ein häufiger Fehler
Warnung
Viele denken, letztendlich heiße „vielleicht nie“. Das stimmt nicht: Hören die Schreibvorgänge auf, erreichen alle Kopien denselben Stand. Offen bleibt nur, wie lange das dauert und was Lesende in der Zwischenzeit sehen.
Bei einer Netztrennung muss man wählen
Zerfällt das Netz in zwei Teile (Netzwerkpartition), können die Teile sich nicht abgleichen. Dann hat man zwei Möglichkeiten.
Entweder lehnt ein Teil Anfragen ab, damit nichts Falsches gelesen wird: starke Konsistenz. Oder beide antworten weiter, mit der Gefahr alter Werte: Verfügbarkeit. Beides zugleich geht nicht. Das ist der Kern des CAP-Theorems.