wake-up-neo.com

Reaktive Programmierung Vorteile/Nachteile

Ich lerne und probiere den reaktiven Stil der Codierung mit Reactor und RxJava. Ich verstehe, dass die reaktive Codierung die CPU im Vergleich zur Single-Thread-Ausführung besser ausnutzt. 

Gibt es einen konkreten Vergleich zwischen reaktiver Programmierung und zwingender Programmierung in webbasierten Anwendungen? 

Wie hoch ist der Leistungsgewinn, den ich durch die Verwendung der reaktiven Programmierung gegenüber der nicht reaktiven Programmierung erhalte?

Was sind auch die Vor- und Nachteile von Reactive Programming? 

Gibt es statistische Benchmarks? 

9
prranay

Reaktive Programmierung bedeutet, dass Sie alle Ihre IO - gebundenen Aufgaben wie Netzwerkaufrufe asynchron ausführen. Für ein Beispiel, dass Ihre Anwendung eine externe REST - API oder eine Datenbank aufruft, können Sie diesen Aufruf asynchron ausführen. Wenn Sie dies tun, blockiert Ihr aktueller Thread nicht. Sie können viele Anforderungen bedienen, indem Sie lediglich einen oder wenige Threads starten. Wenn Sie dem Blocking-Ansatz folgen, benötigen Sie einen Thread, um jede Anfrage zu bearbeiten. Sie können meinen mehrteiligen Blogbeitrag Teil Eins , Teil Zwei und Teil Drei für weitere Details verweisen.

Ansonsten können Sie Rückrufe verwenden, um dasselbe zu tun. Sie können einen asynchronen Aufruf mit Callbacks ausführen. Aber wenn Sie das tun, landen Sie manchmal bei der Rückruf-Hölle. Ein Rückruf in einem anderen führt zu sehr komplexen Codes, die sehr schwer zu warten sind. Andererseits bietet Ihnen RxJava die Möglichkeit, asynchronen Code zu schreiben, der viel einfacher, komponierbarer und lesbarer ist. Außerdem bietet Ihnen RxJava viele leistungsstarke Operatoren wie Map, Zip usw., wodurch Ihr Code viel einfacher wird und die Leistung durch parallele Ausführung verschiedener Aufgaben, die nicht voneinander abhängig sind, verbessert wird.

RxJava ist keine weitere Observer-Implementierung mit einer Reihe von Operatoren, sondern bietet eine gute Fehlerbehandlung und Wiederholungsmechanismen, die sehr praktisch sind. 

Ich habe jedoch kein Benchmarking von RxJava mit imperativem Programmieransatz durchgeführt, um Sie statistisch zu empfehlen. Ich bin jedoch ziemlich sicher, dass RxJava eine gute Leistung gegenüber Blockierungsmechanismen erzielen sollte.

Update

Da ich mit der Zeit mehr Erfahrung gesammelt habe, dachte ich daran, meiner Antwort mehr Punkte hinzuzufügen. 

ReactiveX basiert auf dem article und ist eine Bibliothek zum Erstellen von asynchronen und ereignisbasierten Programmen unter Verwendung beobachtbarer Sequenzen. Ich denke, dass Sie diesen einleitenden Artikel überhaupt durchgehen.

Dies sind einige Eigenschaften reaktiver Systeme: ereignisgesteuert, skalierbar, belastbar, ansprechend

Wenn es um RxJava geht, bietet es einem Programmierer zwei Hauptfunktionen. Erstens bietet es eine Nice Composable-API mit einer großen Anzahl von Operatoren wie Zip, Concat, Map usw. Dies führt zu einfacherem und lesbarerem Code. Beim Code sind Lesbarkeit und Einfachheit die wichtigsten Eigenschaften. Zweitens bietet es hervorragende Abstraktionen, die es ermöglichen, dass Parallelität deklarativ wird. 

Ein weit verbreitetes Missverständnis ist, dass Rx standardmäßig Multithreading ist. Um ehrlich zu sein, ist Rx standardmäßig ein Singlethreading. Wenn Sie asynchron arbeiten möchten, müssen Sie dies explizit mit den subscribeOn- und observeOn-Operatoren angeben, indem Sie relevante Scheduler übergeben. RxJava gibt Ihnen Thread-Pools für asynchrone Aufgaben. Es gibt viele Scheduler wie IO, Berechnung und so weiter. IO Scheduler ist, wie der Name sagt, am besten für IO -intensive Aufgaben wie Netzwerkaufrufe usw. geeignet. Im Gegensatz dazu eignet sich der Scheduler für Rechenaufgaben für CPU-intensivere Berechnungsaufgaben. Sie können auch Ihre eigenen Executor-Services mit RxJava verbinden. Die integrierten Scheduler helfen Ihnen hauptsächlich dabei, Ihre eigenen Executor-Services zu warten, wodurch Ihr Code einfacher wird.

Zum Schluss noch ein Wort zu subscribeOn und observOn

In der Rx-Welt gibt es im Allgemeinen zwei Dinge, für die Sie das Parallelitätsmodell steuern möchten:

  1. Der Aufruf des Abonnements 
  2. Das Beachten von Benachrichtigungen

SubscribeOn: Geben Sie den Scheduler an, auf dem ein Observable arbeiten soll.

ObserveOn: Geben Sie den Scheduler an, auf dem ein Beobachter dieses Observable beobachten wird

16

Nachteile

  • Mehr Speicherintensität, um Datenströme meistens zu speichern (da sie auf Zeitströmen basieren).
  • Vielleicht fühlt es sich unkonventionell an, zu Beginn zu lernen (alles muss ein Stream sein).
  • Die meisten Komplexitäten müssen zum Zeitpunkt der Deklaration neuer Dienste gelöst werden.
  • Mangel an guten und einfachen Ressourcen zum Lernen.

  • Oft verwirrt, um äquivalent zu Functional Reactive Programming zu sein. 

4
kg11

Abgesehen von dem, was sie bereits in Bezug auf keine Blockierungsfunktionen ansprechen, ist die Verwendung von Reactive-Programmierung ein wichtiges Merkmal, und zwar der wichtige Einsatz von Gegendruck. Wird normalerweise in Situationen verwendet, in denen Ihr Publisher mehr Informationen ausgibt, als Ihr Verbraucher verarbeiten kann.

Mit diesem Mechanismus können Sie also den Verkehrsfluss zwischen beiden steuern und unangenehme Speicherprobleme vermeiden.

Einige praktische Beispiele für die reaktive Programmierung finden Sie hier https://github.com/politrons/reactive

Und über Gegendruck hier https://github.com/politrons/Akka/blob/master/src/main/scala/stream/BackPressure.scala

Der einzige Nachteil der reaktiven Programmierung ist übrigens die Lernkurve, da Sie das Paradigma der Programmierung ändern. Heutzutage respektieren und befolgen alle wichtigen Unternehmen das reaktive Manifest http://www.reactivemanifesto.org/

4
paul

Vorteile

  1. Sauberer Code, prägnanter
  2. Einfacher zu lesen (sobald Sie den Dreh raus haben)
  3. Einfacher zu skalieren (jede Operation leiten)
  4. Bessere Fehlerbehandlung
  5. Eventgetrieben inspiriert -> spielt gut mit Streams (Kafka, RabbitMQ, etc)
  6. Gegendruck (Client kann Fluss steuern)

Nachteile

  1. Kann in einigen Fällen speicherintensiver werden
  2. Etwas steile Lernkurve
1
EigenFool

Reactive Programming ist eine Art von Mikroarchitektur, die intelligentes Routing und die Verwendung von Ereignissen beinhaltet.

Reaktiv ist, dass Sie mit weniger mehr erreichen können, insbesondere höhere Lasten mit weniger Threads verarbeiten können.

Reaktive Typen sind nicht dazu gedacht, Ihre Anfragen oder Daten schneller zu verarbeiten. Ihre Stärke liegt in ihrer Fähigkeit, mehr Anfragen gleichzeitig abzuwickeln und Vorgänge mit Latenz, z. B. das Abfragen von Daten von einem Remote-Server, effizienter abzuwickeln.

Sie ermöglichen Ihnen eine bessere Servicequalität und eine vorhersagbare Kapazitätsplanung, indem Sie nativ mit Zeit und Latenz umgehen, ohne mehr Ressourcen zu benötigen. 

Von
https://blog.redelastic.com/what-isreactive-programming-bc9fa7f4a7fchttps://spring.io/blog/2016/06/07/notes-on -reaktive-programmierung-teil-ich-die-reaktive-landschafthttps://spring.io/blog/2016/07/28/reactive-programming-with-spring-5-0-m1

1
kafkas

Reaktive Programmierung ist eine Art zwingender Programmierung. .__ Reaktive Programmierung ist eine Art Parallelprogrammierung. Sie können eine Leistungssteigerung gegenüber der Ausführung mit einem einzigen Thread nur erzielen, wenn Sie parallele Zweige erstellen können. Werden sie von mehreren Threads oder von reaktiven Konstrukten (die tatsächlich asynchrone Prozeduren sind) ausgeführt, spielt dies keine Rolle.

Der einzige Vorteil der reaktiven Programmierung gegenüber der Multithread-Programmierung ist der geringere Speicherbedarf (jeder Thread erfordert 0,5 bis 1 MB). Der Nachteil ist die weniger einfache Programmierung.

0