Reactive Programming

09. Dezember 2016

Veröffentlicht in:

Webentwicklung

Werden Sie reaktiv! - eine Einführung

Obwohl das Reactive Manifesto von 2013 in den letzten Jahren bereits einige Aufmerksamkeit auf sich gezogen hat, scheint dieser Ansatz noch nicht allzu weit in die Praxis vorgedrungen zu sein. Seit der Veröffentlichung des Reactive Manifesto und seiner Aktualisierung im September 2014 setzen vor allem Anbieter von Videostreamingdiensten auf reaktive Systeme. Gerade dieses Services benötigen robustere und anpassungsfähigere Systeme, als das bisher der Fall war. Noch vor wenigen Jahren bestand die technische Infrastruktur vieler Internetservices aus einigen wenigen Servern, die in regelmäßigen Abständen gewartet werden mussten, was teilweise stundenlange Systemausfälle nach sich zog. Heute werden diese Services über ein Zusammenspiel tausender Vielkernprozessoren in der Cloud realisiert, was eine ständige Verfügbarkeit und viel höhere Datendurchsatzraten ermöglicht.

In diesem Grundlagenartikel werfen wir einen Blick auf die Besonderheiten des reaktiven Programmierens im Vergleich zum funktionalen Programmieren. Außerdem beleuchten wir die Möglichkeiten und Anforderungen, die sich daraus für Computersysteme ergeben.

Was ist reaktives Programmieren?

Das reaktive Programmieren (englisch: reactive programming) ist ein Programmierparadigma, das im Juli 2013 von Jonas Bonér, Roland Kuhn, Martin Thompson und Dave Farley in ihrem Reactive Manifesto festgeschrieben wurde. Seit September 2014 liegt das Manifest in der aktualisierten Version 2.0 vor.

Es handelt es sich um einen Designansatz, der den Betrieb von High-Performance-Anwendungen im sehr großen Maßstab erlaubt. Reaktive Systeme erlauben die komplexe, asynchrone Datenverarbeitung mit einer Leistung, die vorher nicht möglich war. Hierzu orientiert sich die reaktive Programmierung nahezu ausschließlich an den Datenströmen. Deshalb müssen in Programmiersprachen, die reactive programming erlauben, statische und dynamische Datenflüsse leicht auszudrücken sein. Änderungen in den Datenflüssen propagiert das zugrundeliegende Ausführungsmodell also automatisch.

Functional Programming vs Reactive Programming

Beim funktionalen Programmieren (englisch: functional programming) bestehen Programme ausschließlich aus Funktionen, bei denen einer Operation ein daraus resultierender Wert zugewiesen wird. Manche Autoren sehen die reaktive Programmierung als Erweiterung des funktionalen Programmieransatzes an, da Änderungen in resultierenden Werten automatisch eine Veränderung in der zugrundeliegenden Funktion nach sich ziehen. Um den Unterschied zwischen der herkömmlichen funktionalen Programmierung und der reaktiven Programmierung zu veranschaulichen, schauen wir uns ein einfaches Beispiel an

Es seien zwei Werte a und b, deren Summe c ergibt, so lautet die zugrunde liegende Funktion a + b = c. Erfolgt nun eine Änderung des Wertes von a oder b, so hat das bei funktionaler Programmierweise keinen direkten Einfluss auf den Wert von c. Folgt die Implementierung der Funktion jedoch den Grundsätzen des reaktiven Programmierparadigmas, so ergibt sich mit einer Änderung von a oder b automatisch ein neuer Wert für c, mit dem das System dann weiter arbeitet. Bekanntestes Beispiel für solch eine einfache reaktive Programmierung dürfte die Summenfunktion eines Tabellenkalkulationsprogramms bieten.

An diesem Beispiel lassen sich einige zentrale Prinzipien des reaktiven Programmierens erkennen:

  • Zustandslosigkeit
  • Unveränderlichkeit der Datenstrukturen
  • Zusammensetzung aus einfachen Funktionen zu einem komplexen Ganzen

Wie man leicht erkennt, sind diese Prinzipien wie geschaffen für die Realisierung reaktiver Computersysteme, wie sie für moderne Webservices mit hohen Zugriffszahlen bei geringsten Reaktionszeiten vonnöten sind. Kenntnisse des reaktiven Programmierens sind also für die Bereitstellung von High-Performance-Anwendungen mit verteilter Infrastruktur unerlässlich.

Anforderungen an reaktive Computersysteme

Verteilte High-Performance-Systeme, wie sie etwa für Streaming Dienste oder Cloud Services benötigt werden, müssen besondere Leistungen erbringen. Sie müssen hohe Datendurchsatzraten und hohe Zugriffszahlen mit möglichst geringer Zugriffszeit ermöglichen. Außerdem muss eine hundertprozentige Zuverlässigkeit gewährleistet sein, lange Wartungszeiten und dadurch bedingte Systemausfälle dürfen nicht vorkommen. Daraus ergeben sich besondere Anforderungen an reaktive Computersysteme:

Reaktionszeiten

Reaktive Systeme müssen jederzeit antwortbereit (Englisch: responsive) sein. Auch unter Volllast muss das System vereinbarte Antwortzeitgrenzen einhalten. Erst eine fehlende Antwort gibt einen eindeutigen Hinweis auf einen Systemfehler. Daher sind festgesetzte Antwortzeiten unbedingt notwendig, um eventuelle Fehler zu erkennen. Außerdem sind schnelle und konsistente Reaktionszeiten ein vertrauensstiftendes Merkmal, das von der Qualität des Systems zeugt.

Resilienz

Ein reaktives System muss widerstandsfähig (English: resilient) und selbst bei Ausfall mehrerer Hard- oder Softwarekomponenten immer noch voll einsatzfähig sein. Um das zu gewährleisten, muss ein reaktives System in Teilsysteme zerlegt werden, die redundant und isoliert vorliegen. Fällt ein Teilsystem aus, wird seine Aufgabe von anderen Systemen übernommen, ohne die Funktionalität des Gesamtsystems zu stören. Nutzer eines solchen Systems müssen sich nicht mit einem eventuellen Systemausfall auseinandersetzen, da ein Totalausfall bei einem widerstandsfähigen System nicht mehr vorkommt.

Elastizität

Um auch unter sich ändernden Lastbedingungen jederzeit antwortbereit zu sein, muss ein reaktives System elastisch (Englisch: elastic) sein. Es darf keine starren Engpässe aufweisen, sondern muss sich in seiner Funktionalität jederzeit der geforderten Leistung anpassen können. Hierzu kann ein zu bearbeitendes Aufgabengebiet in kleine Teile zerlegt werden und dezentral auf beliebig viele Ressourcen verteilt werden. Elastische Systeme verfügen außerdem über die Möglichkeit zur Selbstregulation.

Nachrichtenorientiert

Ein reaktives System funktioniert nachrichtenorientiert (Englisch: message driven). Das heißt, es verwendet asynchrone Nachrichtenübermittlung zwischen verschiedenen Systemkomponenten. Dies führt zu einer Ortsunabhängigkeit der Teilsysteme, die so über ein beliebig großes Netzwerk verteilt werden können. Außerdem erlauben solche Systeme eine sehr effiziente Verwendung von Systemressourcen, da eine Komponente ohne Nachrichteneingang vollständig inaktiv bleiben kann.

Reactive Programming bald auch für kleinere Systeme relevant

Reaktives Programmieren sorgt seit dem Jahr 2013 für großes Aufsehen und hat einen Paradigmenwechsel beim Betrieb von webbasierten Anwendungen herbeigeführt. Statt mit einer Handvoll Hochleistungsserver werden High-Performance-Systeme, wie etwa Streamingportale, mit Tausenden kleinerer Vielkernsysteme betrieben. Solche Systeme sind durch ihre dezentrale und redundante Architektur extrem ausfallsicher und gewährleisten zudem deutlich schnellere Zugriffszeiten als herkömmliche Serversysteme. Zur Steuerung solcher Systeme bietet sich das Paradigma des Reactive Programming an, das als Weiterentwicklung des funktionalen Programmierens angesehen werden kann. Noch scheint reaktives Programmieren eine Domäne von netzbasierten High-Performance-Diensten zu sein, aber es gibt bereits einige Projekte (z.B. der Plasma-Desktop von KDE), die zeigen, dass ein reaktiver Ansatz sich auch für vergleichsweise kleinere Systeme sehr erfolgreich umsetzen lässt.

Sie haben weitere Fragen zur Webentwicklung mit Reactive Programming? Sie planen eine Web-Anwendung, für die Reaktives Programmieren eingesetzt werden soll? Sprechen Sie uns an! Mindtwo in Bonn berät Sie gerne.

Können wir weiterhelfen?

Sie haben ein spannendes Projekt und möchten mit uns zusammenarbeiten? Kontaktieren Sie uns jetzt!

Kostenloses Erstgespräch