Einführung in Node.js, Folge 17: Streams verwenden

Der in der Community bekannte Entwickler Dominic Tarr hat einmal gesagt, Streams seien das beste und zugleich das am wenigsten verstandene Konzept von Node.js. Daher lohnt es sich, die Grundlagen von Streams kennenzulernen. Wie funktionieren Streams, was können sie leisten, und worauf gilt es zu achten?

In Pocket speichern vorlesen Druckansicht
Lesezeit: 2 Min.
Von
  • Golo Roden

Der in der Community bekannte Entwickler Dominic Tarr hat einmal gesagt, Streams seien das beste und zugleich das am wenigsten verstandene Konzept von Node.js. Daher lohnt es sich, die Grundlagen von Streams kennenzulernen. Wie funktionieren Streams, was können sie leisten, und worauf gilt es zu achten?

Ein Streams ist konzeptionell vergleichbar mit einem Array. Der größte Unterschied besteht darin, dass ein Array sämtliche Daten zeitgleich im Speicher hält, ein Stream die Daten hingegen erst im Lauf der Zeit enthält. Dadurch wird es möglich, Datenmengen zu verarbeiten, die größer als der zur Verfügung stehende Speicher sind, und zugleich Latenzzeiten zu verringern.

Mehr Infos

Node.js kennt zu dem Zweck zwei grundlegende Typen von Streams, lesbare und schreibbare. Darauf aufbauend gibt es außerdem sogenannte Duplex- und Transform-Streams. Während lesbare Streams dazu dienen, Daten aus einer Datenquelle auszulesen, verwendet man schreibbare Streams für den Transport der Daten zu der Datenquelle.

Bei der Datenquelle kann es sich beispielsweise um das Dateisystem handeln, denkbar sind aber auch über das Netzwerk erreichbare Endpunkte oder reine In-Memory-Datenstrukturen. Der flüssige Umgang mit lesbaren Streams ist zunächst wichtiger, allerdings verfügen sie auch über die weitaus kompliziertere API.

Doch auch bei schreibbaren Streams ist Vorsicht geboten. Insbesondere wenn man Daten zwischen zwei Streams synchronisieren will, muss darauf geachtet werden, dass die internen Puffer der Streams nicht überlaufen. Das kann man entweder von Hand implementieren oder dazu die in Node.js integrierte pipe-Funktion verwenden, deren Verhalten in gewissen Situationen allerdings auch verstanden sein will.

Wirklich interessant werden Streams, wenn man mehrere Instanzen hintereinander hängt, um beispielsweise eine zu lesende Datei zu verschlüsseln und zu komprimieren, während sie bereits über das Netzwerk wieder an einen Client ausgeliefert wird. Solche Mechanismen lassen sich in Node.js mit geringem Aufwand bauen, allerdings gilt penibel auf Speicherlecks und ähnliche Stolperfallen zu achten.

Wie Streams funktionieren, was sie leisten können, und worauf es zu achten gilt, zeigt das folgende Video:

Empfohlener redaktioneller Inhalt

Mit Ihrer Zustimmmung wird hier eine Vimeo-Video (Vimeo LLC) geladen.

Ich bin damit einverstanden, dass mir externe Inhalte angezeigt werden. Damit können personenbezogene Daten an Drittplattformen (Vimeo LLC) übermittelt werden. Mehr dazu in unserer Datenschutzerklärung.

tl;dr: Streams sind ein mächtiges und äußerst effizientes Konzept in Node.js, das sich stellenweise allerdings nicht so harmlos verhält wie es auf den ersten Blick scheint. Daher ist die Beschäftigung mit den Grundlagen höchst sinnvoll. ()