Ein kurzer Überblick über reaktive Systeme

In den letzten Jahren wurde viel über reaktive Systeme geredet. Mit dem Buzz kommt die Sammlung relevanter Keyword-Salate wie reaktive Streams, reaktive Erweiterungen, reaktive Programmierung, funktionale reaktive Programmierung usw. Wenn Sie lange genug in der Technologiebranche waren, haben Sie das zyklische Auf und Ab von Schlagworten gesehen und Akronyme von Zeit zu Zeit. Also, ist das alles ein weiterer Hype, der bald datiert wird?

Ich habe gehört, dass Softwareentwickler reaktive Systeme als nichts anderes als einen Alias ​​für asynchrone ereignisbasierte Systeme abgetan haben, ähnlich wie manche Microservices als SOA (serviceorientierte Architektur) abzüglich ESB (Enterprise Service Bus) abtun. Während häufig technologische Schlagworte mit neu erfundener Bedeutung auftauchen, sehe ich in reaktiven Systemen genügend charakteristische Merkmale, um zu glauben, dass der Name nicht einfach ein anderer Alias ​​ist.

Was sind reaktive Systeme?

Das Reaktive Manifest beschreibt die wesentlichen Merkmale der reaktiven Systeme: reaktionsschnell, belastbar, elastisch und nachrichtengesteuert. Das ergibt ein Bild auf hoher Ebene und klingt ein wenig allgemein. Insbesondere Reaktionsfähigkeit, Belastbarkeit und Elastizität, die im Manifest beschrieben werden, sind heutzutage fast Standardanforderungen vieler realer Anwendungen.

Vielleicht ist "nachrichtengesteuert" die Anforderung, die reaktive Systeme wirklich von anderen unterscheidet. Unter der Haube beruht ein reaktives System auf Interaktionen über asynchrone Nachrichtenübermittlung, die Grenzen zwischen einzelnen Komponenten festlegen. Ein solches Interaktionsmodell hilft dabei, den Weg zur losen Kopplung sowohl zeitlich als auch ortsbezogen für Parallelität bzw. Verteilbarkeit zu ebnen. Darüber hinaus kann das System mit einem nicht blockierenden Mechanismus zur Regulierung des Datenflusses integriert werden (mehr dazu weiter unten).

Reaktive Ströme

Beim Aufbau reaktiver Systeme scheint es einen herausragenden Ansatz zu geben, bei dem Datenverarbeitungsvorgänge, sofern zutreffend, als Zusammensetzungsstromflüsse formuliert werden. Dies ist nicht Teil der Anforderungen im Reactive Manifesto, aber es könnte das inhärente nachrichtengesteuerte Interaktionsmodell in reaktiven Systemen sein, das natürlich einen solchen stromzentrierten Modellierungsansatz bevorzugt.

Offensichtlich als eigenständige Initiative entstanden, können reaktive Ströme als eine bestimmte Art von reaktiven Systemen angesehen werden, die sich auf die Stromverarbeitung konzentrieren und Zusammensetzungsströme als gerichtete Graphen ausdrücken.

Gegendruck

Einer der zuvor erwähnten nicht blockierenden Regulierungsmechanismen ist der Gegendruck. Dies ist möglicherweise die gefragteste Funktionalität für Systeme, die reaktive Streams implementieren. Es ist ein asynchroner Rückkopplungsmechanismus, der zur Lastregelung in der entgegengesetzten Richtung des Stroms zu den vorgeschalteten Komponenten arbeitet.

Mit dem eingebauten Gegendruck, der die Stromflüsse nicht blockierend regelt, kann das System mit relativ stabileren Speicherauslastungen arbeiten. Diese Funktionalität beseitigt potenziell verheerende Stapelüberlaufprobleme (z. B. verursacht durch eine langsame Datensenke), denen normalerweise durch einen benutzerdefinierten Datenpuffermechanismus während des gesamten Stream-Flusses entgegengewirkt werden müsste.

Was ist mit reaktiver Programmierung?

Als Programmierparadigma für den Aufbau reaktiver Systeme liegt der Schwerpunkt der reaktiven Programmierung auf der Formulierung asynchroner Programmierlogik als Datenströme und der automatischen Weitergabe von Änderungen an Werten korrelierter Variablen im System. Die für ein solches Programmierparadigma verwendeten Sprachen würden geeignete zusammensetzbare Funktionen bereitstellen, um mit den formulierten Strömen zu arbeiten.

Reaktive Programmierung bevorzugt den funktionalen Programmierstil, der Rechenprobleme mithilfe zusammensetzbarer Funktionen ausdrückt und löst. Die Existenz des Begriffs funktionale reaktive Programmierung liegt jedoch mehr als ein Jahrzehnt vor dieser reaktiven "Bewegung". FRP hat einen völlig anderen Fokus und konzentriert sich auf die Verwendung von Funktionen, um Verhaltensweisen über eine kontinuierliche Zeit mit einer einfachen Bezeichnungssemantik auszudrücken. Heute wird es jedoch häufig als reaktive Programmierung mit einem expliziten Schwerpunkt in der funktionalen Programmierung angesehen.

Wenn eine Illustration mit Code besser funktioniert, empfehle ich, den Tutorial-Beitrag von Andre Staltz zu lesen, in dem die Grundlagen der reaktiven Programmierung in JavaScript mit RxJS erläutert werden.

ReactiveX

ReactiveX, auch bekannt als Reactive Extensions, ist eine API-Bibliothek, die die Verwendung von Kompositionsoperationen zur Verarbeitung von Strömen asynchroner Ereignisse ermöglicht. Ausgehend vom Beobachtermuster bilden Observablen und Beobachter (die Abonnenten der Observablen sind) die Hauptbestandteile der Bibliothek mit einer Reihe zusammensetzbarer Operatoren zum Filtern, Transformieren, Aggregieren usw. RxJS und RxJava sind zwei der beliebtesten Implementierungen von ReactiveX in JavaScript bzw. Java.

Akka Schauspieler

Akka ist eine akteursbasierte Bibliothek, mit der skalierbare gleichzeitige und verteilte Anwendungen auf JVM (Java Virtual Machine) erstellt werden können. Im Mittelpunkt stehen Computerprimitive, sogenannte Akteure, die Zustand und Verhalten beibehalten und über asynchrone Nachrichtenübermittlung untereinander kommunizieren.

Akka-Schauspieler, die in Scala geschrieben wurden, sind von Natur aus leicht und locker miteinander verbunden. Zusammen mit den robusten Routing-, Sharding- und Pub-Sub-Funktionen von Akka für skalierbare verteilte Systeme wie IoT sind sie eine hervorragende Plattform für den Aufbau reaktiver Systeme.

Akka strömt

Ein Spitzenreiter (und Gründungsmitglied) der Initiative für reaktive Streams ist Akka Streams. Es basiert auf Akka-Akteuren und bietet eine umfangreiche Reihe von APIs zum Erstellen von Stream-Topologien und zum Verarbeiten von Streams auf höchst kompositorische Weise. Ein kürzlich veröffentlichter Blog-Beitrag von mir befasst sich mit Akka-Streams und wie sie verwendet werden können, um ein grundlegendes Text-Mining durchzuführen.

Anscheinend haben sich Akka-Streams als reaktive Initiative in diesen Tagen bemüht. Akka-Streams-basierte Treiber wie Reactive Rabbit und ReactiveMongo für RabbitMQ und MongoDB haben in der Technologiebranche zunehmend an Dynamik gewonnen. Darüber hinaus ist Akka HTTP, die nächste Generation des Spray REST / HTTP-Toolkits, so konzipiert, dass es mit Akka-Streams als zugrunde liegender Engine streamfähig ist.

Alle Streams orientiert - irgendwie

Mit der stetig wachsenden Dynamik bei der Übernahme der Initiative für reaktive Systeme hat sie offenbar das Stadium eines bloßen Hype überschritten. Es ist offensichtlich auch mehr als ein neu erfundenes Schlagwort für asynchrone ereignisbasierte Systeme. Aus technischer Sicht sehe ich keinen Grund, warum es nicht prominenter wird. Trotzdem sind selbst Open-Source-Technologieinitiativen wie kommerzielle Produkte - ein gutes Timing kann in der Anfangsphase schnell Aufmerksamkeit erregen, und ein geeignetes Marketing kann dazu beitragen, die notwendige Dynamik zu gewinnen, um die breitere Anwenderbasis bekannt zu machen.

In Bezug auf das Timing hat die funktionale Programmierung zugenommen, daher würde ich sagen, dass das Timing großartig ist, da der Programmierstil beim Aufbau reaktiver Systeme positiv berücksichtigt wird. In Bezug auf Marketing glaube ich, dass sich eine intuitivere und aufschlussreichere Benennung der Initiative besser an die Technologiebranche verkaufen würde. Man konnte kaum etwas Sinnvolles verstehen, wenn man den Begriff "reaktive Systeme" zum ersten Mal hörte. Obwohl der Begriff "reaktiv" einen Aspekt der Verbreitung von Veränderungen in solchen Systemen anspricht, springt er dem Publikum nicht als Signaturmerkmal entgegen.

Bei reaktiven Systemen, reaktiven Streams und reaktiven Programmen, die sich hauptsächlich an Streams orientieren, ist der Begriff "Stream" meiner Meinung nach ein aufschlussreicheres Schlüsselwort als "reaktiv". Wenn ich Allgemeinheit mit Einfachheit und Intuition handele, würde ich reaktive Systeme und reaktive Ströme als eine einzige Initiative kombinieren und "reaktiv" durch etwas ersetzen, das sich um "Strom" dreht.