Die Full Stack Week geht der Frage nach, wie Entwickler die Leistungsfähigkeit des Cloudflare-Netzwerks einsetzen, um vollständige und automatisch weltweit nutzbare Anwendungen zu erstellen. Workers verspricht nicht nur eine geringere Latenz, sondern einen Paradigmenwechsel beim Programmieren, der Entwicklern das Leben erleichtert und Anwendungen robuster macht.

Vergangenes Jahr haben wir Durable Objects vorgestellt – eine Möglichkeit, die Zustandsverwaltung von Workers, die am Netzwerkrand von Cloudflare ausgeführt werden, zu koordinieren. Durable Objects ermöglichen es Entwicklern, zuvor komplexe Anwendungen wie das Zusammenarbeiten per Whiteboarding, Gameserver oder globale Warteschlangen mit wenigen Codezeilen zu implementieren.

Wir geben heute bekannt, dass Durable Objects nun allgemein verfügbar und einsatzbereit sind.

Was ist das Besondere an Durable Objects?

Bei vielen herkömmlichen Anwendungen erfolgt die Zustandskoordinierung über eine Datenbank. Auf Workers aufbauende Anwendungen stellen eine Datenbank vor einige besondere Herausforderungen – nämlich die Notwendigkeit, sofort mit globaler Skalierung und hoher Nebenläufigkeit umzugehen, was bei einer Koordination über gemeinsam genutzte Schlüssel zu häufigen Transaktions-Rollbacks führen kann. Datenbanken selbst sind insbesondere auf globaler Ebene schwer zu konfigurieren und zu skalieren, sodass die Entwickler ihre Datenbank speziell auf die Zugriffsmuster von Workern abstimmen müssen.

Durable Objects bieten eine einfachere Struktur: Wenn Sie eine JavaScript-Klasse schreiben, kann Ihre Anwendung benannte Instanzen dieser Klasse erstellen, die garantiert im gesamten Netzwerk von Cloudflare eindeutig sind. Diese Instanz ist ein Durable Object – Workers (und andere Durable Objects!) können über seine ID Nachrichten an das Durable Object senden. Das Durable Object verarbeitet Nachrichten der Reihe nach und in einem einzigen Thread, was eine Koordinierung der Nachrichten ermöglicht. Darüber hinaus bieten wir eine hochgradig konsistente API für die Speicherung der für die „Dauerhaftigkeit“ des Objekts erforderlichen Schlüssel-Wert-Paare.

Nehmen wir zum Beispiel einen Online-Texteditor. Bei einer gängigen Architektur würde der Zustand des Dokuments in einer Datenbank gespeichert und die Benutzer müssten Änderungen dort festhalten. Dies erschwert jedoch die Zusammenarbeit: Wie können mehrere Benutzer sicherstellen, dass alle die neueste Fassung des Dokuments mit den aktuellen Änderungen sehen?

Mit Durable Objects lässt sich dieses Problem viel leichter lösen. Wenn Sie eine Dokumentenklasse schreiben, speichern Sie den Zustand jedes Dokuments in einem Durable Object ab. Stellt ein Benutzer eine Verbindung her, sieht er die neueste Version des Dokuments und kann seine Änderungen synchron mit anderen Bearbeitern vornehmen. Wenn er das Dokument für sich schließt, verschwindet das Durable Object aus dem Speicher. Es verursacht keine Kosten mehr, doch sein Zustand bleibt dauerhaft erhalten. Es muss kein Netzwerk konfiguriert, keine Datenbank verwaltet und keine Autoscaling-Richtlinie implementiert werden – alles funktioniert einfach.

Während einzelne Objekte nur einen einzigen Thread aufweisen, lässt sich mit Durable Objects dank ihrer Struktur eine Objektsammlung praktisch unbegrenzt skalieren. Der Lebenszyklus eines Objekts wird für Sie verwaltet, d. h. es müssen keine Bereinigungsmaßnahmen durchgeführt oder Systeme herunterskaliert werden. Durable Objects kann sofort auf Hunderttausende von Anfragen pro Sekunde skaliert werden und dann ohne Eingreifen des Entwicklers wieder heruntergeschraubt werden.

Was ist seit Einführung des Early Access noch passiert?

Zunächst haben wir an der Verbesserung von Zuverlässigkeit und Performance gearbeitet. Durable Objects stehen hinter einer Reihe von neuen Produkten, die bei Cloudflare entwickelt werden, darunter R2 Storage und Cloudflare Waiting Room.

Bei Waiting Room werden Durable Objects verwendet, um einen möglichst einheitlichen Überblick über die aktuelle Anzahl der Benutzer bieten zu können, die weltweit versuchen, auf eine bestimmte Website zuzugreifen. Die Speicherung dieses häufig aktualisierten Zustands in einer herkömmlichen Datenbank wäre schwierig zu skalieren und würde den globalen Betrieb erheblich erschweren.

Unsere Kunden haben Durable Objects ebenfalls sehr gut angenommen. Wir haben verfolgt, wie ein großes Gaming-Unternehmen seine neue Backend-Architektur auf Durable Objects aufgebaut hat – und damit sowohl den individuellen Spielstatus als auch Multiplayer-Spiele-Lobbys koordiniert. Durable Objects war für die Firma eine naheliegende Wahl, weil damit dynamisches Skalieren ohne Server- oder Datenbankverwaltung möglich ist und sie deshalb ihr Spiel mit einem relativ kleinen Team ausbauen konnte.

Kunden haben weitere Anwendungen entwickelt – von Seiten zur Statusüberwachung bis hin zu kollaborativen Whiteboard-Anwendungen. Wir haben ein besonderes Interesse an der Verwendung von Durable Objects mit WebSockets zur Erstellung uneingeschränkt reaktionsfähiger Anwendungen registriert. Daher haben wir eine Referenzarchitektur veröffentlicht, um Kunden bei der Weiterentwicklung in diesem Bereich zu unterstützen.

Auch was den Betrieb des Systems angeht, sind wir besser geworden – insbesondere bei der Bewältigung einer großen Zahl von Anfragen. Durable Objects kann jetzt Hunderttausende von Anfragen pro Sekunde mit mehreren Objekten und Hunderte von Anfragen mit einem einzelnen Objekt verarbeiten. Damit kann die Lösung nun selbst von den anspruchsvollsten Kunden eingesetzt werden.

Wir haben Regionsbeschränkungen eingeführt, sodass bei Durable Objects nicht nur das Skalieren, sondern auch die Einhaltung der Compliance-Vorgaben mühelos gelingt. Entwickler erhalten damit die Möglichkeit, ein Durable Object mit einer Regionskennzeichnung zu versehen und so sicherzustellen, dass es Daten in genau dieser Region verarbeitet und speichert.

Wir haben den Speicheranfragen an Durable Objects einen Cache vorgeschaltet, wodurch Lese- und Schreibvorgänge blitzschnell abgewickelt werden und gleichzeitig das Schreiben von korrektem, nebenläufigem Code erleichtert wird.

Darüber hinaus haben wir eine Reihe kleinerer Verbesserungen eingeführt, darunter vereinfachte Uploads neuer Durable Objects-Klassen, ein UI im Dashboard und Unterstützung für „wrangler dev“ und „wrangler tail“ zum Live-Debugging.

Wie geht es mit Durable Objects weiter?

Wir arbeiten nach wie vor daran, Durable Objects zur benutzerfreundlichesten Plattform für die Entwicklung unbegrenzt skalierbarer Anwendungen zu machen.

Inzwischen lassen sich Durable Objects gut skalieren, wenn Objekte partitioniert werden können. Doch einzelne Objekte sind auf einen einzigen Thread beschränkt. Viele Workloads könnten über mehrere Threads skaliert werden, wobei nur Lesezugriff auf den Zustand eines Objekts möglich wäre und die Synchronisierung nur bei Zustandsänderungen erfolgen sollte. Wir sprechen von einer Replikation für Durable Objects und befassen uns gerade mit der Entwicklung einer solchen Lösung.

Wir arbeiten auch daran, einem Durable Object eine API hinzuzufügen, mit der ein Rückruf garantiert würde. Damit könnte der Entwickler ein Durable Object zu einem bestimmten Zeitpunkt in der Zukunft aktivieren, um eine Funktion auszuführen. Dies vereinfacht nicht nur die Lebenszyklusverwaltung, sondern es lassen sich damit auch leicht Primitive wie zuverlässige Warteschlangen auf Durable Objects aufbauen.

Wir beschäftigen uns zudem damit, wie sich Objekte besser geografisch verteilen lassen. Dazu gehört die Vision einer automatischen Objektmigration, auf die wir in unserer ersten Ankündigung eingegangen sind.

Gibt es etwas, das Sie gerne hinzugefügt sehen würden? Dann schicken Sie uns einfach eine E-Mail oder einen Tweet!

Wie verwende ich Durable Objects?

Rufen Sie das Cloudflare-Dashboard auf, um Durable Objects zu aktivieren. Stimmen Sie einer zahlungspflichtigen Nutzung unseres Angebots zu und sehen Sie sich dann unsere Muster-Chatanwendung und Referenz-Architektur hier an!

Viel Spaß beim Entwickeln!