Programmation réactive

Définition

Avant toutes choses, étudions ce qui se cache derrière le terme de programmation réactive.

La définition dit que c’est un paradigme de programmation asynchrone basé sur le pattern Observable – Observer. Il repose sur les concepts de propagation du changement et de flux de données. Ces derniers pouvant provenir d’émetteurs à destination de consommateurs.

Voici un lien vers le manifest associé : https://www.reactivemanifesto.org/

Bon, avec ces éléments, je pense que tout ça reste assez flou pour tout le monde. Alors à quoi ça correspond concrètement et à quoi ça peut servir ?

Commençons par un exemple

Pour comprendre un peu mieux les concepts commençons avec un exemple de la vie courante.

Pour se faire je vais reprendre un exemple que j’ai trouvé assez pertinent.

Imaginons que vous vouliez l’avis d’un ami sur un livre.

Une première approche serait de lui demander de lire le livre et d’attendre patiemment à côté de lui qu’il le finisse pour pouvoir en discuter avec lui.

Exemple flux synchrone
Exemple synchrone

Ca peut être long, en attendant vous êtes bloqué et vous ne faites rien d’autre. Pas très engageant mais vous avez votre réponse.

Une seconde approche serait de lui demander de lire le livre puis de vous appeler lorsqu’il a finit. Vous pouvez alors vaquer à vos activités. Une fois fini, votre ami vous appelle et vous avez votre réponse.

Exemple flux asynchrone
Exemple asynchrone

Ça peut être long là aussi, mais vous n’êtes plus bloqué. Vous utilisez votre temps pour avancer sur d’autres tâches. Vous finissez par obtenir la réponse de votre ami.

Voici comment dans la seconde approche on peut faire le rapport avec la programmation réactive :

Vous, vous émettez une requête et vous allez vous abonner, vous mettre à l’écoute de la réponse. Vous allez avoir finalement un rôle de consommateur.

Votre ami, c’est l’émetteur du flux de données auquel vous allez vous abonner. Il va avoir un rôle de producteur.

Si on pousse l’exemple un peu plus loin, comme nous pourrions décider avec notre ami qu’il nous appelle à chaque fois qu’il finit un livre. Nous aurions alors un flux de données créé entre lui et nous.

Exemple flux plus complexe
Exemple flux

Plus concrètement

Comme on vient de l’illustrer dans l’exemple précédent la programmation réactive est une programmation liée à des flux de données asynchrones.

Ces flux de données sont représentés par des séquences d’évènements en cours de production et ordonnés dans le temps.

Trois types de signaux peuvent être émis par un flux :

  • une valeur, qui sera dans notre exemple l’avis sur le livre
  • une erreur, par exemple notre ami n’a pas pu nous joindre
  • un signal « fin », on ne veut plus que notre ami nous donne son avis sur ses lectures

On pourra alors définir des fonctions pour traiter les valeurs reçues. Ces fonctions seront des observateurs (observer) du flux (observable). On retrouve notre pattern Observable – Observer.

Nous conservons uniquement le flux lié aux avis de notre ami.

Exemple flux réactif
Exemple flux PR

Sur ce flux nous allons pouvoir appliquer des fonctions de filtre (filter), de transformation (map) et bien d’autres.

Dans notre cas nous pourrions vouloir filtrer les avis sur les livres d’un certain auteur par exemple.

Pour aider à la visualisation de l’application des fonctions sur les flux on peut s’appuyer sur le site : https://rxmarbles.com/

Types de flux

Les flux que l’on peut manipuler peuvent être déclarés différemment selon l’usage nécessaire.

Type « cold »

La source de données est créée et déclenchée dans l’observable, chaque observer aura sa propre source.

Exemple : un stream vidéo, chaque utilisateur veut avoir son propre flux

Type « hot »

La source de données est créée hors de l’observable et déclenchée dans l’observable, chaque observer verra la même chose en même temps.

Exemple : une présentation en ligne, le présentateur ne veut pas recommencer à chaque fois que quelqu’un se connecte

Un peu de code

Voici un exemple qui compare et illustre la différence entre l’écriture impérative et réactive.

@Test
public void testMethodeImperative() {
        // Manipulation d’une liste en style impératif
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        // On affiche le contenu de la liste
        list.stream().forEach(result -> System.out.println("Ajouté à la liste : " + result));
        System.out.println("Autre tâche");
        list.add(3);
        System.out.println("Encore une autre tâche");
        list.add(4);
        // La liste a été modifié mais les changements n'ont pas été affiché
    }
Ajouté à la liste : 1
Ajouté à la liste : 2
Autre tâche
Encore une autre tâche
@Test
public void testMethodeReactive() {
        // Manipulation d’une source en style réactif
 (JavaRx)
        Subject<Integer> list = ReplaySubject.create();
        list.onNext(1);
        list.onNext(2);
        // On s'abonne aux événements de la liste et on exécute une fonction pour chacun d'eux
        list.subscribe(result -> System.out.println("Ajouté à la liste: " + result));
        System.out.println("Autre tâche");
        list.onNext(3);
        System.out.println("Encore une autre tâche");
        list.onNext(4);
    }
Ajouté à la liste: 1
Ajouté à la liste: 2
Autre tâche
Ajouté à la liste: 3
Encore une autre tâche
Ajouté à la liste: 4

Les avantages de la programmation réactive

Ce paradigme de programmation à les avantages suivants :

  • Eviter le Callback Hell
  • On travaille sur des flux de données. Ce qui permet d’utiliser facilement des opérations comme la composition, et la transformation des flux non-bloquants. Inévitables lors du traitement de volumes de données importants
  • Gérer les problématiques de back-pressure
  • Gestion de la concurrence et de l’obsolescence des données. On réduit le couplage entre les actions, les données, les traitements et le résultat des traitements
  • Amélioration de la résilience et de la scalabilité

Implémentations

L’API de prédilection est Rx (pour Reactive eXtensions) développée principalement par Netflix. Pour cette API, de nombreuse implémentations sont disponibles. Il y a de fortes chances que votre langage préféré s’y trouve (http://reactivex.io/languages.html), avec notamment :

Pour aller plus loin

https://www.arolla.fr/blog/2019/11/passer-a-vitesse-superieure-grace-a-programmation-reactive/
https://putaindecode.io/articles/la-programmation-reactive-avec-rxjs/
https://medium.com/whozapp/reactive-programming-101-f4e2d82de365
https://home.heeere.com/tech-intro-programmation-reactive.html

S’abonner
Notifier de
guest
0 Commentaires
Inline Feedbacks
View all comments