web-dev-qa-db-fra.com

Programmation réactive Avantages/Inconvénients

Je continue à étudier et à essayer le style de code réactif en utilisant Reactor et RxJava. Je comprends que le codage réactif permet une meilleure utilisation du processeur par rapport à l’exécution à un seul thread. 

Existe-t-il une comparaison concrète entre la programmation réactive et la programmation impérative dans les applications Web? 

Quel est le gain en performances et en débit que j'obtiens en utilisant la programmation réactive par rapport à la programmation non réactive?

De plus, quels sont les avantages et les inconvénients de la programmation réactive? 

Existe-t-il un repère statistique? 

9
prranay

Eh bien, la programmation réactive signifie que vous exécutez toutes vos tâches liées IO telles que les appels réseau de manière asynchrone. Pour une instance, par exemple, votre application appelle une API externe REST ou une base de données, vous pouvez effectuer cette invocation de manière asynchrone. Si vous le faites, votre thread actuel ne bloque pas. Vous pouvez répondre à de nombreuses demandes en générant simplement un ou plusieurs threads. Si vous suivez l'approche de blocage, vous devez disposer d'un thread pour gérer chaque requête. Vous pouvez consulter mon article de blog en plusieurs parties première partie , deuxième partie et troisième partie pour plus de détails.

Sinon, vous pouvez utiliser des rappels pour faire la même chose. Vous pouvez effectuer une invocation asynchrone à l'aide de rappels. Mais si vous le faites parfois, vous risquez de vous retrouver avec un enfer de rappel. Avoir un rappel dans un autre conduit à des codes très complexes et très difficiles à gérer. D'autre part, RxJava vous permet d'écrire du code asynchrone beaucoup plus simple, composable et lisible. De plus, RxJava vous fournit un grand nombre d'opérateurs puissants tels que Map, Zip, etc., ce qui simplifie considérablement votre code tout en augmentant les performances grâce à l'exécution en parallèle de différentes tâches non dépendantes l'une de l'autre.

RxJava n'est pas une autre implémentation d'Observer avec un ensemble d'opérateurs, mais vous offre une bonne gestion des erreurs et des mécanismes de nouvelle tentative très pratiques. 

Mais je n'ai pas effectué d'analyse comparative de RxJava avec une approche de programmation impérative pour vous recommander statistiquement. Mais je suis à peu près sûr que RxJava devrait offrir de bonnes performances par rapport aux mécanismes de blocage.

Mettre à jour

Comme j'ai accumulé plus d'expérience au fil du temps, j'ai pensé ajouter plus de points à ma réponse. 

Basé sur le article _, ReactiveX est une bibliothèque permettant de composer des programmes asynchrones et basés sur des événements en utilisant des séquences observables. Je vous prie de bien vouloir lire cet article d'introduction.

Voici quelques propriétés des systèmes réactifs: événementiel, évolutif, résilient, réactif

Lorsqu'il s'agit de RxJava, il offre deux fonctionnalités principales à un programmeur. Tout d’abord, il offre une API composable Nice utilisant un riche ensemble d’opérateurs tels que Zip, concat, map, etc. Cela donne un code plus simple et lisible. En matière de code, la lisibilité et la simplicité sont les propriétés les plus importantes. Deuxièmement, il fournit d’excellentes abstractions, qui permettent à la concurrence d’être déclarative. 

Une idée fausse répandue est que Rx est multithread par défaut. Pour être honnête, Rx est single-threaded par défaut. Si vous voulez faire les choses de manière asynchrone, vous devez le dire explicitement en utilisant les opérateurs subscribeOn et observeOn en transmettant les planificateurs appropriés. RxJava vous donne des pools de threads pour effectuer des tâches asynchrones. Il existe de nombreux ordonnanceurs tels que IO, Computation, etc. IO le planificateur, comme son nom l'indique, convient mieux pour IO les tâches intensives telles que les appels réseau, etc. Au contraire, le planificateur de calcul convient aux tâches de calcul plus gourmandes en ressources CPU. Vous pouvez également connecter vos propres services Executor avec RxJava. Les planificateurs intégrés vous aident principalement à vous débarrasser de la maintenance de vos propres services Executor, simplifiant ainsi votre code.

Enfin un mot sur subscribeOn et observeOn

Dans le monde Rx, vous voulez généralement contrôler le modèle de concurrence pour deux choses:

  1. L'invocation de l'abonnement 
  2. L'observation des notifications

SubscribeOn: spécifiez le planificateur sur lequel un observable fonctionnera.

ObserveOn: spécifie le planificateur sur lequel un observateur observera cet observable

16
Ravindra Ranwala

Désavantages

  • Consomme plus de mémoire pour stocker des flux de données la plupart du temps (car il est basé sur les flux dans le temps).
  • Pourrait se sentir peu conventionnel d'apprendre au début (tout doit être un flux).
  • La plupart des complexités doivent être traitées lors de la déclaration de nouveaux services.
  • Manque de ressources simples et bonnes à apprendre.

  • Souvent confondu pour être équivalent à la programmation réactive fonctionnelle. 

4
kg11

Mis à part ce qu'ils ont déjà répondu en ce qui concerne l'absence de fonctionnalités de blocage, une autre fonctionnalité intéressante pour utiliser la programmation réactive est l'utilisation importante de la contre-pression. Est normalement utilisé dans des situations où votre éditeur émet plus d'informations que votre consommateur ne peut en traiter.

Ainsi, grâce à ce mécanisme, vous pouvez contrôler le flux de trafic entre les deux et éviter les problèmes de mémoire insuffisants.

Vous pouvez voir quelques exemples pratiques de programmation réactive ici https://github.com/politrons/reactive

Et à propos de la pression ici https://github.com/politrons/Akka/blob/master/src/main/scala/stream/BackPressure.scala

En passant, le seul inconvénient de la programmation réactive est la courbe d’apprentissage car vous changez de paradigme de programmation. Mais de nos jours, toutes les entreprises importantes respectent et suivent le manifeste réactif http://www.reactivemanifesto.org/

4
paul

La programmation réactive est un style de micro-architecture impliquant un routage et une consommation intelligents d'événements.

Réactif signifie que vous pouvez faire plus avec moins, en particulier vous pouvez traiter des charges plus élevées avec moins de threads.

Les types réactifs ne sont pas conçus pour vous permettre de traiter vos demandes ou vos données plus rapidement. Leur force réside dans leur capacité à traiter simultanément plus de demandes et à gérer des opérations avec latence, telles que la demande de données à un serveur distant.

Ils vous permettent de fournir une meilleure qualité de service et une planification de capacité prévisible en gérant de manière native le temps et la latence sans consommer plus de ressources. 

De
https://blog.redelastic.com/what-is-reactive-programming-bc9fa7f4a7fchttps://spring.io/blog/2016/06/07/notes-on -reactive-programming-part-i-the-reactive-landscapehttps://spring.io/blog/2016/07/28/reactive-programming-with-spring-5-0-m1

1
kafkas

La programmation réactive est une sorte de programmation impérative. La programmation réactive est une sorte de programmation parallèle. Si vous parvenez à créer des branches parallèles, vous ne pourrez obtenir des performances supérieures à l’exécution à un seul thread. Seront-ils exécutés par plusieurs threads, ou par des constructions réactives (qui sont en fait des procédures asynchrones), n'a pas d'importance.

Le seul avantage de la programmation réactive par rapport à la programmation multithread est une consommation de mémoire réduite (chaque thread nécessite 0,5 à 1 mégaoctet). L'inconvénient est une programmation moins facile.

0