Halbierte Latenz: Webframework IHP 1.5.0 mit neuer Datenbankschicht

Das Webframework IHP 1.5.0 bringt eine neue Datenbankschicht, deutliche Performance-Gewinne und eine verbesserte modulare Architektur.

vorlesen Druckansicht 1 Kommentar lesen
Illustration von Webentwicklung mit Computer, Datenbanken, Wolken und Werkzeugen.

(Bild: heise medien)

Lesezeit: 4 Min.
Inhaltsverzeichnis
close notice

This article is also available in English. It was translated with technical assistance and editorially reviewed before publication.

Das Webframework IHP liegt in Version 1.5.0 vor. Es handelt sich um das bisher größte Release des Open-Source-Projekts mit 1.051 Commits. Die Entwickler haben die gesamte Datenbankschicht neu geschrieben, die Performance an vielen Stellen verbessert und die Architektur modularisiert.

IHP (Integrated Haskell Platform) ist ein Webframework, das viele für Webanwendungen typische Funktionen bereits ab Werk mitbringt. Es kombiniert die funktionale Programmiersprache Haskell mit dem Paketmanager Nix. Nix sorgt dabei für reproduzierbare Entwicklungsumgebungen. Das Framework richtet sich an Entwickler und Teams, die Webanwendungen mit hoher Typsicherheit und möglichst wenigen Laufzeitfehlern bauen wollen. IHP liefert dafür alle nötigen Werkzeuge mit – vom Prototyping bis zur Produktion.

Die größte Änderung in Version 1.5.0 betrifft den Datenbankzugriff. IHP wechselt vom älteren Treiber postgresql-simple auf hasql. Dieser aktuellere Treiber nutzt das binäre Protokoll von PostgreSQL und arbeitet mit vorbereiteten Anweisungen (Prepared Statements). In Produktionsumgebungen sinkt die Latenz bei Datenbankabfragen dadurch um bis zu 50 Prozent. Die bestehende Query-Builder-API bleibt unverändert – vorhandener Code funktioniert ohne Anpassungen weiter. Nur wer bisher direkt auf postgresql-simple zugegriffen hat, muss migrieren.

Darüber hinaus haben die IHP-Entwickler auch andere Teile des Frameworks beschleunigt. Laut Release Notes belegt der integrierte Entwicklungsserver – er basiert auf GHCi, der interaktiven Umgebung des Haskell-Compilers – jetzt nur noch 500 bis 800 MByte Arbeitsspeicher statt zuvor 4 GByte. Ferner soll die Session-Middleware bei Routen, die nicht auf die Session zugreifen, dreimal schneller arbeiten. Die URL-Generierung soll nach dem Update fünfmal schneller und die Render-Pipeline doppelt so schnell wie in der Vorgängerversion sein.

Das neue Paket ihp-typed-sql führt einen sogenannten Quasiquoter ein – ein Haskell-Mechanismus, der SQL-Syntax direkt im Code erlaubt. Das Besondere: Der Compiler verbindet sich während des Übersetzungsvorgangs mit der Entwicklungsdatenbank und prüft, ob Tabellen, Spalten und Datentypen korrekt sind. Er erkennt auch, welche Spalten durch LEFT JOIN Null-Werte annehmen können. Fehlerhafte SQL-Abfragen fallen so bereits beim Build auf, nicht erst zur Laufzeit.

Mit der neuen Funktion fetchPipelined können Entwickler mehrere unabhängige Datenbankabfragen in einem einzigen Netzwerk-Roundtrip an PostgreSQL senden. Statt jede Abfrage einzeln abzuschicken und auf die Antwort zu warten, schickt IHP alle Abfragen direkt hintereinander. Die Datenbank verarbeitet sie und liefert die Ergebnisse gebündelt zurück. Das reduziert die Netzwerklatenz spürbar.

IHP ist mit dieser Version weniger monolithisch aufgebaut. Die Entwickler haben über 15 Module – darunter ihp-mail, ihp-datasync und ihp-schema-compiler – als eigenständige Pakete auf Hackage veröffentlicht, dem zentralen Paket-Repository für Haskell (vergleichbar mit npm für JavaScript oder PyPI für Python). Andere Haskell-Projekte können diese Bibliotheken damit nutzen, ohne das gesamte Framework einzubinden. Bestehende IHP-Projekte sind nicht betroffen: Die Module werden weiterhin aus dem Hauptpaket re-exportiert.

Videos by heise

Darüber hinaus bringt Version 1.5.0 unter anderem Custom Routes für individuelle URLs neben dem automatischen Routing, Unterstützung für zusammengesetzte Primärschlüssel (Composite Primary Keys) und einen Integrationstestmodus mit automatisch erzeugter temporärer PostgreSQL-Datenbank. Als Standard-Compiler dient nun GHC 9.10, experimentell unterstützt IHP auch GHC 9.12.

Da der Wechsel der Datenbankschicht und die Modularisierung einige inkompatible Änderungen (Breaking Changes) mit sich bringen, stellt das Entwicklerteam einen Upgrade-Guide mit Schritt-für-Schritt-Anleitung bereit. Alle Informationen finden sich in den Release Notes auf GitHub.

(fo)