Cloudflare
KV
Cloudflare KV
Consistência Eventual
Cache
Edge
Serverless

Cloudflare KV: Was global verteilt bedeutet, wenn Sie schreiben müssen

Wie die Eventual-Consistency-Architektur von Cloudflare KV in der Praxis funktioniert, für welche Workloads sie konzipiert ist und wo sie Sie in der Produktion zurückwirft.

Cloudflare KV: Was global verteilt bedeutet, wenn Sie schreiben müssen

Cloudflare KV wird als weltweit verteilter Shop verkauft und diese Beschreibung ist technisch korrekt. Was dabei außer Acht gelassen wird, ist, dass „Global verteilt“ vollständig auf Lesevorgänge und nur teilweise auf Schreibvorgänge zutrifft – mit einer Verzögerung von bis zu 60 Sekunden, die alles an der Art und Weise ändert, wie Sie es verwenden sollten.

Wenn Sie einen Schlüssel in KV schreiben, wird die Schrift an einen zentralen Speicher weitergeleitet. Von dort aus verbreitet es sich an alle Cloudflare-Präsenzpunkte – mehr als 300 PoPs weltweit verteilt. Diese Ausbreitung erfolgt nicht augenblicklich. Die offizielle Dokumentation gibt an, dass es bis zu 60 Sekunden dauern kann, bis alle PoPs den neuen Wert erhalten. Während dieses Fensters kann ein Worker in Frankfurt den alten Wert zurückgeben, während ein Worker in São Paulo bereits den neuen Wert sieht. Zwei Arbeiter in derselben Region können voneinander abweichen, wenn einer von ihnen das Update noch nicht erhalten hat.

Das ist letztendliche Konsistenz. Cloudflare dokumentiert dieses Verhalten eindeutig, aber der Ausdruck „global verteilt“ ist so verführerisch, dass viele Teams diesen Teil erst lesen, wenn sie einen Fehler in der Produktion beheben.

Was passiert bei einer Lesung?

Beim Lesen in KV gibt es zwei Wege, und der Unterschied zwischen ihnen ist für die Latenz von Bedeutung. Wenn ein Worker env.MY_KV.get('chave') ausführt, prüft die Laufzeit, ob dieser Schlüssel im PoP zwischengespeichert ist, der die Anfrage bedient. Wenn dies der Fall ist – und das ist bei den meisten Tastenkombinationen der Fall – wird der Messwert in weniger als einer Millisekunde direkt aus dem PoP-Speicher zurückgegeben. Das ist der glückliche Weg und macht KV außergewöhnlich schnell beim Lesen.

Wenn der Schlüssel nicht in diesem PoP zwischengespeichert ist – weil es sich um einen neuen Schlüssel handelt, weil er kürzlich geschrieben wurde und noch nicht weitergegeben wurde oder weil der PoP diese Eingabe einfach nicht erhalten hat – durchsucht die Laufzeit den zentralen Speicher. Dies fügt etwa 20 ms hinzu. Es ist nicht dramatisch, aber es ist messbar, und Sie werden sehen, dass diese Zahl in der Spur erscheint, wenn der Schlüssel kalt ist.

Das Detail, das für Überraschung sorgt: Es gibt keine Garantie für Lese-/Schreibzugriff. Sie schreiben einen Schlüssel und versuchen sofort, ihn im selben Worker-Aufruf zu lesen. Beim Lesen kann der vorherige Wert zurückgegeben werden. Dieses Verhalten ist dokumentiert und beabsichtigt – es ist eine direkte Folge der PoP-Caching-Architektur. Wenn Sie Lese-/Schreibzugriff benötigen, ist KV nicht das richtige Tool für diesen Ablauf.

Für welchen Arbeitsaufwand wurde der KV gebaut

Die KV-Architektur macht durchaus Sinn, wenn man das Problem kennt, das sie löst: Daten, die mit niedriger Frequenz geschrieben und mit sehr hoher Frequenz gelesen werden. Das Wirtschaftsmodell verstärkt dieses Muster. Nach den ersten 10 Millionen kostenlosen monatlichen Lesevorgängen kosten 0,50 US-Dollar pro Million. Einschreibungen kosten 0,50 $ pro Million nach der ersten kostenlosen Million. Im kostenlosen Kontingent haben Sie 100.000 Lesevorgänge pro Tag und nur 1.000 Schreibvorgänge pro Tag.

Die Kosten und Grenzen deuten auf den gleichen Arbeitsaufwand hin: wenig schreiben, viel lesen. Feature Flags sind das kanonische Beispiel. Eine JSON-Datei mit Produktflags ändert sich höchstens ein paar Mal am Tag. Aber es wird bei jeder Anfrage von jedem Arbeiter in jedem PoP der Welt gelesen. Für eine Flagge ist eine Ausbreitungsdauer von 60 Sekunden akzeptabel – es ist nicht erforderlich, dass jeder Benutzer auf der Welt das Merkmal in derselben Millisekunde sieht. Die Anzahl der Lesevorgänge, potenziell Milliarden pro Monat, wird zu minimalen Kosten zwischengespeichert.

Die gleiche Argumentation gilt für gerenderte HTML-Vorlagen, Anwendungskonfiguration, Katalogdaten mit einer geringen Aktualisierungshäufigkeit und Sitzungstoken mit einer definierten TTL. Sie schreiben einmal, lesen zehntausende Male, und KV liefert das mit Cache-Latenz.

Wo wird KV dich verraten?

Jede Arbeitslast, die sofortige Konsistenz erfordert, führt zu Fehlern, wenn sie über KV implementiert wird. Der häufigste Fall ist eine Benutzersitzung mit veränderbarem Status. Der Benutzer meldet sich ab; Sie schreiben das ungültige Sitzungsflag in KV; In den nächsten 60 Sekunden kann ein anderer PoP weiterhin Anfragen mit dem alten Token authentifizieren, da er das Update nicht erhalten hat.

Genaue Zähler sind ein weiterer Fehlerpunkt. KV hat keine atomaren Operationen – es gibt kein Vergleichen und Tauschen, es gibt kein atomares Inkrement. Zwei Worker, die gleichzeitig denselben Zähler lesen, lesen denselben Wert, erhöhen ihn unabhängig voneinander und einer der Inkremente geht verloren. Für geschwindigkeitsbegrenzende Zähler, die genau sein müssen, ist KV das falsche Werkzeug. Für diesen Fall gibt es langlebige Objekte.

Auch Daten, die sich pro Anfrage ändern, passen nicht. Wenn jede Antwort an den Benutzer einen Wert im KV ändert, zahlen Sie 0,50 US-Dollar pro Million Schreibvorgänge in einem Volumen, das gigantisch sein kann, mit einer Latenz von ~150 ms pro Schreibvorgang für die Bestätigung im zentralen Speicher, plus Ausbreitungsverzögerung. Die Kosten skalieren in einer Weise, die wirtschaftlich keinen Sinn ergibt, und die Schreiblatenz erscheint im p99-Ende Ihrer Anfragen.

Für sofortige Konsistenz pro Schlüssel und geringer Schreiblatenz ist D1 mit der Sessions-API der aktuelle Weg von Cloudflare. Für einen gemeinsamen Zustand, der atomare Operationen erfordert, dauerhafte Objekte.

Das Kostenmodell ohne Illusionen

Der kostenlose Kontingent ist großzügig zum Experimentieren, aber schmal für die Produktion beliebiger Volumina. 100.000 Messwerte pro Tag entsprechen etwas mehr als einer konstanten Anfrage pro Sekunde – eine echte Anwendung mit angemessenem Datenverkehr übersteigt diesen Wert in Minuten.

Was sich im kostenpflichtigen Tarif ändert, ist, dass die Lesungen im großen Maßstab praktisch kostenlos sind. 0,50 US-Dollar pro Million Lesevorgänge sind günstig genug, um nicht als relevanter Posten auf der Rechnung zu erscheinen, wenn Ihre Arbeitslast richtig leselastig ist. Schreibvorgänge kosten 0,50 US-Dollar pro Million, davon 1 Million kostenlos pro Monat, und decken die meisten Konfigurationsstandards und Flags ohne nennenswerte Kosten ab.

Was Sie vielleicht überraschen wird, ist der Speicherplatz: 0,50 $ pro GB im Monat zusätzlich zum ersten kostenlosen GB. Bei kleinen Werten – Konfigurations-JSON, Token, Flags – werden Sie diese Grenze kaum erreichen. Für diejenigen, die darüber nachdenken, Binärdateien mit beträchtlicher Größe in KV zu speichern (die Grenze pro Wert liegt bei 25 MB), werden die Speicherkosten sichtbar. Für große Dateien ist R2 mit 0,015 $/GB sinnvoller.

Was KV gut löst und was nicht

KV ist ein leistungsstarkes Lesetool mit gelegentlichem Schreiben. Wenn Sie sich für dieses Modell entscheiden, bietet es eine Latenzzeit von unter einer Millisekunde für Hot Reads, eine automatische globale Verteilung ohne Einrichtung einer Replikation und ein Preismodell, das Lesevorgänge mit großem Volumen bevorzugt.

Der Fehler besteht nicht darin, KV zu verwenden, sondern es so zu verwenden, als wäre es eine Allzweckdatenbank. Kein Tool ersetzt eine korrekte Workload-Diagnose. Wenn sich Ihre Daten pro Benutzer häufig ändern, Atomizität oder sofortige Konsistenz erfordern, ist KV nicht geeignet – und das werden Sie in der Produktion und nicht in der Entwicklung feststellen.

Lesen Sie auch