3 Punkte von GN⁺ 2024-10-28 | 1 Kommentare | Auf WhatsApp teilen

SQLite als Speicher für statische Inhalte auf einem Webserver verwenden

Hintergrund

  • Clace ist eine Plattform, die in erster Linie dafür entwickelt wurde, Webanwendungen für interne Tools bereitzustellen.
  • Clace integriert Funktionen, die sonst getrennt von Webserver und Applikationsserver verarbeitet werden.
  • In der frühen Entwicklung von Clace war es wichtig zu entscheiden, wie Anwendungsdaten und Metadaten gespeichert werden sollten.
  • Metadaten in einer Datenbank zu speichern, war sinnvoll, während statische Dateien üblicherweise im Dateisystem abgelegt werden.

SQLite für die Bereitstellung von Dateien

  • Clace entschied sich dafür, App-Dateien statt im Dateisystem in SQLite zu speichern.
  • Dadurch sind atomare Versionswechsel möglich, sodass bei Updates mehrere Dateien in einer einzigen Transaktion verarbeitet werden können.
  • Beim Erstellen und Aktualisieren von Apps werden alle Dateien in die SQLite-Datenbank hochgeladen; im Entwicklungsmodus wird das lokale Dateisystem verwendet.

Vorteile der Nutzung von SQLite

  • Transaktionale Updates: Mehrere Dateien können auf einmal aktualisiert werden, wodurch sichergestellt wird, dass es während eines Updates keine defekte Web-App gibt.
  • Rollback von Deployments: Bei Fehlern kann ein Deployment zurückgesetzt werden, und das Zurückrollen einer Datenbanktransaktion ist einfacher als das Aufräumen eines Dateisystems.
  • Deduplizierung von Dateien zwischen Versionen: Selbst wenn identische Dateien in mehreren Versionen vorhanden sind, wird der Dateiinhalt nur einmal gespeichert.
  • Deduplizierung zwischen Apps: Verhindert Duplikate, wenn identische Dateien in mehreren Apps vorhanden sind.
  • Einfache Backups: Mit SQLite lässt sich der Systemzustand leicht sichern.
  • Content-Hashing: Beim Hochladen von Dateien wird der Content-SHA gespeichert, was Browser-Caching erleichtert.
  • Komprimierung: Dateiinhalte werden komprimiert mit Brotli gespeichert und können leicht in verschiedenen Formaten abgelegt werden.

Leistung

  • Der SQLite-Datenbankzugriff von Clace bietet eine hervorragende Leistung.
  • Da es keine gleichwertige Implementierung mit Dateisystem gibt, wurden keine direkten Benchmark-Tests durchgeführt.
  • Laut Benchmarks des SQLite-Teams kann SQLite bei manchen Workloads eine bessere Leistung als das Dateisystem bieten.

Multi-Node-Unterstützung

  • Clace läuft derzeit auf einem einzelnen Node.
  • Wenn Multi-Node-Unterstützung hinzugefügt wird, ist geplant, statt lokalem SQLite eine gemeinsam genutzte Postgres-Datenbank zu verwenden.
  • Dadurch können Latenzprobleme entstehen; um diese zu reduzieren, soll eine lokale SQLite-Datenbank als Datei-Cache verwendet werden.

Warum dieser Ansatz nicht üblich ist

  • Die meisten Webserver verwenden aus Gründen der Bequemlichkeit ein Dateisystem.
  • Mit Dateisystem-Tools lassen sich Dateien direkt aktualisieren, während bei einer Datenbank eine API-Schnittstelle für den Datei-Upload erforderlich ist.

Zusammenfassung von GN⁺

  • Clace ist eine Plattform für die Entwicklung und Bereitstellung interner Tools und maximiert mit SQLite die Vorteile der Dateispeicherung.
  • Durch den Einsatz von SQLite bietet Clace verschiedene Vorteile wie transaktionale Updates, Rollbacks, Deduplizierung und einfache Backups.
  • Dieser Ansatz ist wegen der Bequemlichkeit des Dateisystems und aus historischen Gründen nicht weit verbreitet, steigert aber durch die Nutzung von Leistung und Funktionen von SQLite die Effizienz.
  • Als Projekte mit ähnlichen Funktionen werden unter anderem Firebase und AWS Lambda empfohlen.

1 Kommentare

 
GN⁺ 2024-10-28
Hacker-News-Kommentare
  • Vor ein paar Jahren habe ich, inspiriert von dem Artikel "35% Faster Than The Filesystem", ein Experiment durchgeführt, bei dem statische Dateien mit SQLite ausgeliefert wurden. Ich habe ein Plugin gebaut, das über Datasette statische Dateien aus SQLite bereitstellt, habe es aber nicht besonders oft genutzt. Wenn man Dateien mit SQLite ausliefern will, kann das CLI-Tool sqlite-utils insert-files nützlich sein.

  • Transaktionale Updates sind ein wesentlicher Vorteil, weil man mehrere Dateien gleichzeitig aktualisieren kann. Egal ob der Server SQLite oder das Dateisystem verwendet: Man kann nicht verhindern, dass eine Web-App während eines Updates kaputtgeht. Deshalb sollten alle Unterressourcen einer Seite so referenziert werden, dass sie einen bestimmten Content-Hash oder Versionsnamen verwenden.

  • Als ich 2011/2012 bei einem kleinen Spieleentwicklungsunternehmen gearbeitet habe, haben wir alle Assets in einer sqlite3-Datenbank gespeichert und pak-Dateien erstellt, die die Offsets der Dateien enthielten. So konnten wir Assets in Mobile Games schnell laden, und weil die Metadaten in der Datenbank lagen, konnten wir ähnliche Dateien leicht finden.

  • Im Vergleich zum Dateisystem hat SQLite den Vorteil, dass man Dateien abfragen kann. SQL-Abfragen lassen sich mit Kysely typsicher verwenden.

  • Die Idee, statische Inhalte mit SQLite auszuliefern, ist nicht rundum überzeugend. Moderne Webserver verwenden optimale Strategien zur Verarbeitung statischer Dateien. SQLite bietet zwar Unterstützung für Memory-Mapped I/O, ist aber für große Websites nicht geeignet.

  • SQLite eignet sich für Websites mit weniger als 100K Hits pro Tag. Die SQLite-Website verarbeitet 400K bis 500K HTTP-Anfragen pro Tag, und in den meisten Fällen liegt die Load Average unter 0,1.

  • CMS für Static Site Generators verwenden eine SQLite-Datenbank, um Websites zu entwickeln und zu aktualisieren, und dumpen sie anschließend als statische Seiten ins Dateisystem zur Auslieferung.

  • Im wissenschaftlichen Hochleistungsrechnen ist eine schreibgeschützte SQLite-Datenbank auf einer RAM-Disk oft die flexibelste und leistungsfähigste Methode, auf Daten zuzugreifen.

  • Es wäre interessant, den SQLite-Ansatz mit Fällen zu vergleichen, in denen das Dateisystem Deduplizierung, Snapshots, Versionsverwaltung und Komprimierung bieten kann. Mit fortschrittlichen Dateisystemen könnte es einfacher sein, ein Verzeichnis durch eine neue Version zu ersetzen.

  • Der Ansatz, eine Datenbank als Dateisystem zu verwenden, hat Vorteile, kann aber zum Albtraum werden, wenn Probleme auftreten.