Database Oriented Operating System (DBOS)

Der bessere Weg, Cloud-Apps zu entwickeln?

02.05.2024
Von 
Martin Heller schreibt als freier Autor für die Schwesterpublikation InfoWorld.
DBOS "denkt" App-Entwicklung in der Cloud neu. Das sollten Sie über das Open-Source-Projekt wissen.
DBOS stellt eine drastische (und auf den ersten Blick unter Umständen absonderliche) Abkehr von bisherigen Konzepten der App-Entwicklung in der Cloud dar.
DBOS stellt eine drastische (und auf den ersten Blick unter Umständen absonderliche) Abkehr von bisherigen Konzepten der App-Entwicklung in der Cloud dar.
Foto: Tattoboo | shutterstock.com

Das Open-Source-Projekt Database Oriented Operating System (DBOS) wurde von Wissenschaftlern des MIT und der Stanford University im Rahmen eines kooperativen Forschungsprojekts auf die Beine gestellt. DBOS stellt Entwicklern in Aussicht, stabile Cloud-Native-Applikationen bei hoher Fehlertoleranz schneller, einfacher und sicherer erstellen zu können.

Im Folgenden werfen wir einen detaillierten Blick auf die Entstehungsgeschichte, Komponenten und Funktionen von DBOS - und sagen Ihnen, wie Sie erste Schritte in der Praxis gehen.

Was ist DBOS?

Ende März 2024 verkündete Postgres-Schöpfer und DBOS-Mitbegründer Mike Stonebraker im Rahmen eines Blogbeitrags die Veröffentlichung von DBOS Cloud, "einer transaktionalen, Serverless-Computing-Plattform, die durch das revolutionäre, neue Betriebssystem DBOS ermöglicht wird und Betriebssystem-Services auf einer verteilten Datenbank implementiert". Das klingt bei initialem Konsum - gelinde gesagt - ein wenig seltsam, ergibt aber mit Blick auf die Entstehungsgeschichte von DBOS durchaus Sinn. Die erläutert Stonebraker ebenfalls in besagtem Blogbeitrag:

Die Idee für DBOS entstand vor drei Jahren, als ich erkannte, dass der State, den ein Betriebssystem aufrechterhalten muss (Dateien, Prozesse, Threads, Nachrichten etcetera), um etwa sechs Größenordnungen gewachsen ist, seit ich 1973 mit Unix auf einer PDP-11/40 meine ersten Schritte tat. Aus dieser Perspektive ist es in erster Linie ein Datenbankproblem, den OS-State zu speichern. Dazu kommt, dass es sich bei Linux um Legacy-Code handelt, der sich nur schwer weiterentwickeln lässt. So gibt es zum Beispiel keine Multi-Node-Version - ein Orchestrierungs-Tool wie Kubernetes ist also obligatorisch. Als ich dann einen Vortrag von Matei Zaharia hörte, in dem er sagte, dass Databricks für seine Zwecke herkömmliche OS-Scheduling-Technologien nicht nutzen konnte und stattdessen auf eine Datenbankmanagement-Lösung setzte, war mir klar: Es war an der Zeit, letztere in den Kernel zu verlagern und ein neues Betriebssystem zu entwickeln.

Die verteilte Datenbank fußt (auf dem Papier) auf einem Minimal-Kernel, ist aber unterhalb der OS Services angesiedelt - statt wie eine herkömmliche Datenbank im Applikations-Layer zu laufen.
Die verteilte Datenbank fußt (auf dem Papier) auf einem Minimal-Kernel, ist aber unterhalb der OS Services angesiedelt - statt wie eine herkömmliche Datenbank im Applikations-Layer zu laufen.
Foto: Martin Heller | IDG

Falls Sie Mike Stonebraker noch nicht kannten: Er ist bereits seit den frühen 1970er Jahren als Informatiker mit Datenbank-Fokus tätig. Zu seinen Errungenschaften zählen unter anderem die Entwicklung des relationalen Datenbanksystems Ingres, das später Sybase inspirierte - was wiederum die Grundlage für Microsoft SQL Server bildete. Zudem leistete Stonebraker Grundlagenarbeit für Postgres, das sich später zu PostgreSQL (und Illustra) weiterentwickelte. Angesichts dieser Historie überrascht es nicht, dass DBOS eine verteilte PostgreSQL-Version als Kernel-Database-Layer nutzt.

DBOS-Funktionen

Im Folgenden werfen wir einen Blick auf die wesentlichen Komponenten von DBOS und ihre Features. Im Anschluß betrachten wir einige besonders interessante Aspekte im Detail.

Bei DBOS Transact handelt es sich um ein Open-Source-TypeScript-Framework. Dieses unterstützt:

DBOS Cloud ist eine transaktionale Serverless-Plattform, um DBOS-Transact-Apps bereitzustellen. Sie bietet Support für:

DBOS Transact

Der Code im folgenden Screenshot demonstriert Transaktionen sowie HTTP-Serving mit GET. Es lohnt sich also, die 18 Zeilen genau zu analysieren.

Dieser Typescript-Code für eine Hello-Klasse wird generiert, wenn Sie einen DBOS-Create-Prozess anstoßen.
Dieser Typescript-Code für eine Hello-Klasse wird generiert, wenn Sie einen DBOS-Create-Prozess anstoßen.
Foto: Martin Heller | IDG

Der erste Import (Zeile 1) bringt die DBOS-SDK-Klassen ein, die wir benötigen. Der zweite Import (Zeile 2) beschert uns den Knex.js SQL Query Builder, der die parametrisierte Abfrage an die Postgres-Datenbank sendet und die resultierenden Zeilen zurückgibt. Das Datenbankschema wird schließlich in den Zeilen 4 bis 8 definiert. Die einzigen Spalten sind ein name-String und ein greet_count-Integer.

Die einzige Methode innerhalb der Hello-Klasse ist helloTransaction. Sie wird mit den Decorators @GetApi und @Transaction verpackt. Diese bewirken jeweils, dass besagte Methode über den Pfad /greeting/ als Antwort auf einen HTTP GET-Request geliefert wird - gefolgt vom zu übergebenden Username-Parameter. Das stellt sicher, dass nicht zwei Instanzen parallel die Datenbank aktualisieren.

Der Datenbank-Query-String in Zeile 16 nutzt PostgreSQL-Syntax, um für den zur Verfügung gestellten Namen eine Zeile in die Datenbank einzufügen und diese mit dem Initialwert 1 auszustatten. Sollte diese Zeile bereits existieren, führt der ON CONFLICT-Trigger eine Aktualisierungsoperation aus. Wie in Zeile 17 zu sehen, wird die SQL-Abfrage mit Knex.js an die DBOS-Systemdatenbank gesendet und ihr Ergebnis abgerufen.

DBOS Time Travel Debugger

Wenn Sie eine Anwendung in DBOS Cloud ausführen, wird jeder Schritt und jede Änderung in der Datenbank festgehalten. Debuggen können Sie dabei entweder mit Visual Studio Code oder der DBOS Time Travel Debugger Extension. Letztere erlaubt Ihnen, Ihre DBOS-Applikation anhand der Datenbank (so wie sie zum Zeitpunkt des ausgewählten Workflows aussah) zu debuggen.

Um den Time Travel Debugger zu nutzen, starten Sie mit einer CodeLens, um aus einer Liste gespeicherter Workflows den betreffenden auszuwählen.
Um den Time Travel Debugger zu nutzen, starten Sie mit einer CodeLens, um aus einer Liste gespeicherter Workflows den betreffenden auszuwählen.
Foto: Martin Heller | IDG
Time-travel Debugging mit einem gespeicherten Workflow erinnert stark an rudimentäre Arbeit mit Visual Studio Code.
Time-travel Debugging mit einem gespeicherten Workflow erinnert stark an rudimentäre Arbeit mit Visual Studio Code.
Foto: Martin Heller | IDG

DBOS Quickstart Tutorial

Das folgende Quickstart-Tutorial erfordert Node.js 20 (oder höher) und eine PostgreSQL-Datenbank, zu der Sie entweder lokal, über einen Docker-Container oder remote eine Verbindung herstellen können. Der eigentliche Quickstart beginnt damit, ein DBOS-App-Verzeichnis mit Node.js zu erstellen.

martinheller@Martins-M1-MBP ~ % npx -y @dbos-inc/create@latest -n myapp

Merged .gitignore files saved to myapp/.gitignore

added 590 packages, and audited 591 packages in 25s

found 0 vulnerabilities

added 1 package, and audited 592 packages in 1s

found 0 vulnerabilities

added 129 packages, and audited 721 packages in 5s

found 0 vulnerabilities

Application initialized successfully!

Anschließend füttern Sie die Anwendung mit den Daten Ihres Postgres-Servers und exportieren Ihr Passwort in eine Umgebungsvariable.

martinheller@Martins-M1-MBP ~ % cd myapp

martinheller@Martins-M1-MBP myapp % npx dbos configure

? What is the hostname of your Postgres server? localhost

? What is the port of your Postgres server? 5432

? What is your Postgres username? postgres

martinheller@Martins-M1-MBP myapp % export PGPASSWORD=*********

Im nächsten Schritt erstellen Sie eine "Hello"-Datenbank mit Node.js und Knex.js.

martinheller@Martins-M1-MBP myapp % npx dbos migrate

2024-04-09 15:01:42 [info]: Starting migration: creating database hello if it does not exist

2024-04-09 15:01:42 [info]: Database hello does not exist, creating...

2024-04-09 15:01:42 [info]: Executing migration command: npx knex migrate:latest

2024-04-09 15:01:43 [info]: Batch 1 run: 1 migrations

2024-04-09 15:01:43 [info]: Creating DBOS tables and system database.

2024-04-09 15:01:43 [info]: Migration successful!

Hiernach können Sie die DBOS-Applikation lokal erstellen und ausführen.

martinheller@Martins-M1-MBP myapp % npm run build

npx dbos start

> myapp@0.0.1 build

> tsc

2024-04-09 15:02:30 [info]: Workflow executor initialized

2024-04-09 15:02:30 [info]: HTTP endpoints supported:

2024-04-09 15:02:30 [info]: GET : /greeting/:user

2024-04-09 15:02:30 [info]: DBOS Server is running at http://localhost:3000

2024-04-09 15:02:30 [info]: DBOS Admin Server is running at http://localhost:3001

^C

An diesem Punkt können Sie http://localhost:3000 aufrufen, um die Anwendung zu testen. Danach registrieren Sie sich für DBOS Cloud und stellen dort Ihre eigene Datenbank bereit.

martinheller@Martins-M1-MBP myapp % npx dbos-cloud register -u meheller

2024-04-09 15:11:35 [info]: Welcome to DBOS Cloud!

2024-04-09 15:11:35 [info]: Before creating an account, please tell us a bit about yourself!

Enter First/Given Name: Martin

Enter Last/Family Name: Heller

Enter Company: self

2024-04-09 15:12:06 [info]: Please authenticate with DBOS Cloud!

Login URL: https://login.dbos.dev/activate?user_code=QWKW-TXTB

2024-04-09 15:12:12 [info]: Waiting for login...

2024-04-09 15:12:17 [info]: Waiting for login...

2024-04-09 15:12:22 [info]: Waiting for login...

2024-04-09 15:12:27 [info]: Waiting for login...

2024-04-09 15:12:32 [info]: Waiting for login...

2024-04-09 15:12:38 [info]: Waiting for login...

2024-04-09 15:12:44 [info]: meheller successfully registered!

martinheller@Martins-M1-MBP myapp % npx dbos-cloud db provision iw_db -U meheller

Database Password: ********

2024-04-09 15:19:22 [info]: Successfully started provisioning database: iw_db

2024-04-09 15:19:28 [info]: {"PostgresInstanceName":"iw_db","HostName":"userdb-51fcc211-6ed3-4450-a90e-0f864fc1066c.cvc4gmaa6qm9.us-east-1.rds.amazonaws.com","Status":"available","Port":5432,"DatabaseUsername":"meheller","AdminUsername":"meheller"}

2024-04-09 15:19:28 [info]: Database successfully provisioned!

Im letzten Schritt können Sie schließlich Ihre Applikation über DBOS Cloud registrieren und bereitstellen.

martinheller@Martins-M1-MBP myapp % npx dbos-cloud app register -d iw_db

2024-04-09 15:20:09 [info]: Loaded application name from package.json: myapp

2024-04-09 15:20:09 [info]: Registering application: myapp

2024-04-09 15:20:11 [info]: myapp ID: d8806829-c5b8-4df0-8b5a-2d1bf87c3322

2024-04-09 15:20:11 [info]: Successfully registered myapp!

martinheller@Martins-M1-MBP myapp % npx dbos-cloud app deploy

2024-04-09 15:20:35 [info]: Loaded application name from package.json: myapp

2024-04-09 15:20:35 [info]: Submitting deploy request for myapp

2024-04-09 15:21:09 [info]: Submitted deploy request for myapp. Assigned version: 1712676035

2024-04-09 15:21:13 [info]: Waiting for myapp with version 1712676035 to be available

2024-04-09 15:21:21 [info]: Successfully deployed myapp!

2024-04-09 15:21:21 [info]: Access your application at https://meheller-myapp.cloud.dbos.dev/

Diese "Hello"-Anwendung resultiert aus dem obenstehenden Code.
Diese "Hello"-Anwendung resultiert aus dem obenstehenden Code.
Foto: Martin Heller | IDG

Diese Anwendung veranschaulicht einige Kernfunktionen von DBOS Transact und DBOS Cloud, ist dabei aber so einfach gestrickt, dass sie eher untauglich ist, um damit zu experimentieren. Das DBOS "Programming Quickstart"-Tutorial ist etwas tiefgehender angelegt. Hier lernen Sie zum Beispiel, wie Sie Communicator-Funktionen verwenden, um auf Dienste von Drittanbietern zuzugreifen oder wie Sie zuverlässige Workflows zusammenstellen.

DBOS-Demo-Applikationen

Wenn Sie das "Programming Quickstart"-Tutorial durchdrungen haben, stehen Ihnen zudem zwei verschiedene DBOS-Demo-Anwendungen zur Verfügung. Beide verwenden Next.js in Sachen Frontend und setzen auf DBOS-Workflows, -Transaktionen und -Kommunikatoren.

  • E-Commerce ist ein Web-Shopping- und Payment-Processing-System.

  • YKY Social, simuliert ein einfaches soziales Netzwerk und verwendet TypeORM anstelle von Knex.js für seinen Datenbankcode.

Fazit: DBOS (Cloud) verlockt!

DBOS und DBOS Cloud sehen unserer Meinung nach sehr interessant aus, nicht zuletzt wegen der zuverlässigen Execution und der Möglichkeit des Time-Travel Debugging. Vor dem Real-World-Einsatz gilt es allerdings noch einige Fragen zu beantworten. Zum Beispiel mit Blick auf Skalierbarkeit und Kosten.

Ob sich DBOS unter Entwicklern durchsetzt, bleibt ohnehin abzuwarten. Schließlich tendieren diese eher dazu, an Gewohnheiten festzuhalten - bis die nicht mehr funktionieren. Insofern könnte eine Umstellung auf DBOS und den auf den ersten Blick etwas extravagant anmutenden Code eine Herausforderung darstellen. Zu erwähnen ist auch, dass die aktuelle Implementierung von DBOS dem Schaubild am Anfang des Artikels eher fern als nah ist: DBOS läuft aktuell auf macOS, Linux, Windows - DBOS Cloud auf AWS. Von "Minimal Kernel" kann da eher keine Rede sein.

Dennoch hat DBOS seinen Reiz und die Reputation der Köpfe hinter dem Projekt spricht für sich selbst. Bis DBOS Mainstream wird, könnte es trotzdem noch eine ganze Zeit lang dauern. (fm)

Dieser Beitrag basiert auf einem Artikel unserer US-Schwesterpublikation Infoworld.