Announcing D1: Our first SQL database

Wir haben 2017 Cloudflare Workers angekündigt, um Entwicklern die Datenverarbeitung in unserem Netzwerk zu ermöglichen. Wir waren begeistert von den Möglichkeiten, die sich daraus ergaben. Allerdings bemerkten wir rasch, dass die meisten Anwendungen in der realen Welt zustandsbehaftet sind. Seitdem haben wir KV, Durable Objects und R2 bereitgestellt, die Entwicklern den Zugang zu verschiedenen Arten von Speicher bieten.

Wir freuen uns, heute D1, unsere erste SQL-Datenbank, vorstellen zu können.

Der Beta-Zugriff sollte bald starten – wir planen, dass Nutzer bereits im Juni den entsprechenden Zugang erhalten können (hier anmelden). Wir freuen uns ganz besonders schon heute einige Details zu den bevorstehenden Meilensteinen bekanntzugeben.

Wir präsentieren: D1 – die für Cloudflare Workers entwickelte Datenbank

D1 basiert auf SQLite. SQLite ist nicht nur die am weitesten verbreitete Datenbank der Welt, die täglich von Milliarden von Geräten genutzt wird, sondern auch die erste serverlose Datenbank überhaupt. Überrascht? SQLite war seiner Zeit so weit voraus, dass es sich selbst als „ serverless “ bezeichnete, bevor der Begriff mit Cloud-Diensten in Verbindung gebracht wurde, und ursprünglich buchstäblich „ohne Server“ bedeutete.

Workers selbst wird zwischen dem Server und dem Client ausgeführt. Es wurde von einer Technologie inspiriert, die für den Client entwickelt wurde. Darum erschien SQLite die perfekte Lösung für unseren ersten Einstieg in den Bereich der Datenbanken.

Was kann man also mit D1 bauen? In Wahrheit: „Fast alles!". Vielleicht kann man sich so allerdings wenig konkretes vorstellen. Wie wäre es dann mit einer Live-Demo?

D1-Demo: Northwind Traders

Sie möchten ein Beispiel für D1 in Aktion sehen? Dann spielen Sie doch mit unserer Demo herum, die hier läuft: northwind.d1sql.com.

Vielleicht fragen Sie sich jetzt „Wer sind Northwind Traders?“. Northwind Traders ist, wenn Sie so wollen, das „Hello, World!“ der Datenbanken. Eine Beispieldatenbank, die Microsoft zusammen mit Microsoft Access zur Verfügung stellt, um sie als eigenes Tutorial zu verwenden. Sie erschien erstmals vor 25 Jahren, 1997, und im Internet finden Sie viele Beispiele für ihre Verwendung.

Es handelt sich um eine typische Geschäftsanwendung mit einem realistischen Schema, mit vielen Fremdschlüsseln, über viele verschiedene Tabellen hinweg – eine wirklich zeitlose Darstellung von Daten.

Wann wurde die letzte Bestellung von Queso Cabrales versandt, und mit welchem Schiff war sie unterwegs? Das können Sie schnell herausfinden. Jemand hat angerufen und wollte Chai bestellen? Gut, dass Exotic Liquids noch 39 Stück auf Lager hat, für nur 18 $ pro Stück.

Wir laden Sie zum Spielen und Herumstöbern ein und beantworten gerne alle Fragen, die Sie über Northwind Trading haben.

Die Northwind Traders-Demo bietet auch ein Dashboard, auf dem Sie Details und Metriken zu den D1-SQL-Abfragen finden, die hinter den Kulissen ablaufen.

Was können Sie mit D1 entwickeln?

Aber zurück zu unserer ursprünglichen Frage vor der Demo: Was kann man mit D1 entwickeln?

Auch wenn Sie Northwind Traders vielleicht nicht selbst betreiben, haben Sie wahrscheinlich irgendwo eine sehr ähnliche Software im Einsatz. Selbst der Kern des Cloudflare-Dienstes ist eine Datenbank. Eine SQL-Datenbank, die mit Tabellen, materialisierten Ansichten und einer Fülle von gespeicherten Prozeduren gefüllt ist. Jedes Mal, wenn ein Kunde mit unserem Dashboard interagiert, ändert sich der Status in dieser Datenbank.

Tatsache ist, dass Datenbanken überall sind. Sie befinden sich in dem Webbrowser, in dem Sie dies lesen, in jeder App auf Ihrem Telefon. Sie sind der Speicher für Ihre Banktransaktionen, Reisebuchungen, Geschäftsanwendungen und so weiter. Unser Ziel mit D1 ist es, Ihnen bei der Entwicklung von APIs bis hin zu umfangreichen und leistungsstarken Anwendungen zu helfen, einschließlich E-Commerce-Websites, Buchhaltungssoftware, SaaS-Lösungen und CRMs.

Sie können D1 sogar mit Cloudflare Access kombinieren und interne Dashboards und Verwaltungstools erstellen, die nur für die Mitarbeiter Ihres Unternehmens sicher zugänglich sind. Ihnen stehen endlos viele Möglichkeiten zur Auswahl.

Die Erfahrung der D1-Entwickler

Wir werden weiter unten in diesem Beitrag über die Fähigkeiten und kommenden Funktionen sprechen, aber im Kern ist die Stärke von D1 die Entwicklererfahrung: Sie können im Handumdrehen vom Nichts zu einer vollwertigen Anwendung übergehen. Erinnern Sie sich an ein Tool bzw. Werkzeug, das die Entwicklung schier magisch gemacht hat. Genau so soll sich die Entwicklung mit Workers und D1 anfühlen.

Um Ihnen einen Eindruck davon zu vermitteln, sehen Sie hier, wie der Einstieg in D1 aussehen wird.

Erstellen Ihrer ersten D1-Datenbank

Mit D1 können Sie mit wenigen Klicks eine Datenbank erstellen: Definieren Sie Tabellen, fügen Sie Daten ein oder laden Sie diese hoch, ohne dass Sie sich irgendwelche Befehle merken müssen, es sei denn, Sie brauchen sie.

Sie bevorzugen stattdessen die Kommandozeile? Kein Problem. Wir haben Anfang dieser Woche den neuen und verbesserten Wrangler 2 angekündigt, das beste Tool für die Verwaltung und Bereitstellung Ihrer Workers und bald auch Ihr Tool für die Bereitstellung von D1. Wrangler wird auch eine native Unterstützung für D1 bieten, so dass Sie Datenbanken mit ein paar einfachen Befehlen erstellen und verwalten können:

Zugriff auf D1 von Ihrem Worker aus

Das Anhängen von D1 an Ihren Worker ist so einfach wie das Erstellen einer neuen Bindung. Jede D1-Datenbank, die Sie an Ihren Worker anhängen, wird mit ihrer eigenen Bindung an den Parameter env angehängt:

export default {
  async fetch(request, env, ctx) {
    const { pathname } = new URL(request.url)
    if (pathname === '/num-products') {
      const { result } = await env.DB.get(`SELECT count(*) AS num_products FROM Product;`)
      return new Response(`There are ${result.num_products} products in the D1 database!`)
    }
  }
}

Ein etwas komplexeres Beispiel ist die sichere Übergabe von Parametern von der URL an die Datenbank mithilfe eines Routers und parametrisierter Abfragen:

import { Router } from 'itty-router';
const router = Router();

router.get('/product/:id', async ({ params }, env) => {
  const { result } = await env.DB.get(
    `SELECT * FROM Product WHERE ID = $id;`,
    { $id: params.id }
  )
  return new Response(JSON.stringify(result), {
    headers: {
      'content-type': 'application/json'
    }
  })
})

export default {
  fetch: router.handle,
}

Was können Sie also von D1 erwarten?

In erster Linie wollen wir, dass Sie mit D1 entwickeln können, ohne sich über die Kosten Gedanken machen zu müssen.

Hier bei Cloudflare halten wir nichts von dem Ansatz, Ihre Daten als Geisel zu halten. Darum wird D1, wie R2, vollkommen frei von Ausstiegsgebühren sein. Unser Plan ist es, D1 so zu bepreisen, wie wir unsere Speicherprodukte bepreisen, indem wir den Basisspeicher und die durchgeführten Datenbankoperationen berechnen.

Aber auch hier wollen wir nicht, dass sich unsere Kunden Gedanken über die Kosten machen oder darüber, was passiert, wenn ihr Unternehmen wächst und sie mehr Speicherplatz benötigen oder mehr Aktivitäten haben. Wir möchten, dass Sie so einfache oder komplexe Anwendungen erstellen können, wie Sie es für Ihre Bedürfnisse benötigen. Wir sorgen dafür, dass D1 weniger kostet und mehr leistet als vergleichbare zentralisierte Lösungen. Das Versprechen von Serverless und einem globalen Netzwerk wie dem von Cloudflare sind Performance und niedrigere Kosten, die durch unsere Architektur erzielt werden.

Hier ist eine kleine Vorschau auf die Funktionen von D1.

Replikation lesen

Mit D1 wollen wir es einfach machen, den Zustand Ihrer gesamten Anwendung an einem Ort zu speichern, damit Sie beliebige Abfragen über den gesamten Datensatz durchführen können. Das ist es, was relationale Datenbanken so leistungsfähig macht.

Wir sind jedoch davon überzeugt, dass „leistungsstark“ nicht „umständlich“ sein sollte. Die meisten relationalen Datenbanken sind riesige, monolithische Gebilde, die Konfiguration der Replikation ist nicht trivial. Daher sind die meisten Systeme so konzipiert, dass alle Lese- und Schreibvorgänge zu einer einzigen Instanz zurückfließen. D1 verfolgt einen anderen Ansatz.

Mit D1 wollen wir Ihnen die Konfiguration abnehmen und die Vorteile des globalen Netzwerks von Cloudflare nutzen. D1 erstellt schreibgeschützte Klone Ihrer Daten in der Nähe Ihrer Nutzer und hält sie bei Änderungen stets auf dem neuesten Stand.

Batch-Verarbeitung

Viele Vorgänge in einer Anwendung erzeugen nicht nur eine einzige Abfrage. Wenn Ihre Logik in einem Worker in der Nähe des Benutzers ausgeführt wird, aber jede dieser Abfragen in der Datenbank ausgeführt werden muss, dann ist es äußerst ineffizient, sie einzeln über die Leitung zu schicken.

Die API von D1 beinhaltet Batch-Verarbeitung: überall dort, wo Sie eine einzelne SQL-Anweisung senden können, können Sie auch ein Array davon bereitstellen. Das bedeutet, dass Sie nur einen einzigen HTTP-Roundtrip benötigen, um mehrere Vorgänge durchzuführen. Dies ist perfekt für Transaktionen, die atomar ausgeführt und übertragen werden müssen:

async function recordPurchase(userId, productId, amount) { 
  const result = await env.DB.exec([
    [
      `UPDATE users SET balance = balance - $amount WHERE user_id = $user_id`,
      { $amount: amount, $user_id: userId },
    ],
    [
      'UPDATE product SET total_sales = total_sales + $amount WHERE product_id = $product_id',
      { $amount: amount, $product_id: productId },
    ],
  ])
  return result
}

Eingebettete Datenverarbeitung

Aber wir gehen noch einen Schritt weiter. Mit D1 wird es möglich sein, einen Teil Ihres Worker-Codes zu definieren, der direkt neben der Datenbank ausgeführt wird. Dadurch erhalten Sie die volle Kontrolle und maximale Performance – jede Anfrage trifft zunächst auf Ihren Worker in der Nähe Ihrer Benutzer, kann aber je nach Vorgang an einen anderen Worker weitergegeben werden, der neben einer Replik oder Ihrer primären D1-Instanz eingesetzt wird, um seine Arbeit zu erledigen.

Backups und Redundanz

Es gibt nur wenige Dinge, die so kritisch sind wie die in der Datenbank Ihrer Hauptanwendung gespeicherten Daten. Deshalb speichert D1 in regelmäßigen Abständen automatisch Snapshots Ihrer Datenbank auf dem Cloud-Speicherdienst R2 von Cloudflare, die sich mit einem Klick wiederherstellen lassen. Und da wir auf der redundanten Speicherung von Durable Objects aufbauen, kann Ihre Datenbank bei Bedarf physisch an einen anderen Ort verlagert werden, was zu einer sekundenschnellen Selbstheilung selbst bei katastrophalen Problemen führt.

Importieren und Exportieren von Daten

D1 unterstützt zwar bereits die SQLite-API, so dass Sie Ihre Abfragen leicht schreiben können, aber Sie brauchen vielleicht auch Daten, um sie auszuführen. Wenn Sie keine brandneue Anwendung erstellen, möchten Sie vielleicht einen bestehenden Datensatz aus einer anderen Quelle oder Datenbank importieren. Deshalb werden wir daran arbeiten, dass Sie Ihre eigenen Daten in D1 einbringen können.

Ein weiterer Vorteil von SQLite ist seine Portabilität. Wenn Ihre Anwendung z. B. eine spezielle Staging-Umgebung hat, können Sie einen Snapshot dieser Daten auf Ihren lokalen Rechner klonen, um damit zu entwickeln. Und wir werden noch mehr Flexibilität hinzufügen, z. B. die Möglichkeit, für jede neue Pull-Anfrage für Ihr Pages-Projekt eine neue Datenbank mit einem Satz von Testdaten zu erstellen.

Was kommt als Nächstes?

Wie Sie es aus bisherigen Ankündigungen von Cloudflare kennen, schließen wir auch an dieser Stelle mit „Das ist erst der Anfang!“. Wir sind wirklich begeistert von all den leistungsstarken Möglichkeiten, die unsere Datenbank in unserem globalen Netzwerk eröffnet.Denken Sie schon darüber nach, was Sie mit D1 und Workers bauen werden? Wir auch. Übermitteln Sie uns Ihre Kontaktdaten und wir geben Ihnen so bald wie möglich Zugang. Halten Sie Ausschau nach einer Beta-Einladung von uns, die bereits im Juni 2022 beginnt!