La programmation réactive

La programmation réactive

La base de la programmation réactive est de déclencher des actions en observant des données. C’est aussi un paradigme déclaratif : on enchaîne un appel de fonctions ou d’expressions logiques déjà conçues, puis à la fin tout se calcule. La programmation réactive s’utilise par-dessus les langages de programmation, ou en créant un langage dédié à un domaine (ex. SQL pour les bases de données). Elle permet de créer des interfaces utilisateurs interactives, des animations en temps réels, des applications backend sans surcharge…

La programmation réactive fonctionne avec une source (ou producteur) et un consommateur (ou abonné). La source peut être statique ou dynamique, comme un flux vidéo, un tableau, le retour d’un appel : elle produit des données dans le temps. Des opérations de transformation, filtrages, et autres peuvent s’y ajouter. Le consommateur reçoit les données petit à petit. On lui définit une action à effectuer sur chaque élément.

La source, le consommateur, et les opérations peuvent être asynchrones (en parallèle) afin d’utiliser les ressources de tous les CPU ou de plusieurs machines. Lorsque la source est plus rapide que le consommateur, les données s’accumulent dans un tampon, appelé buffer en anglais. Le tampon peut s’agrandir jusqu’à saturer la mémoire de la machine. Appliquer une contre-pression (ou backpressure) évite cette saturation.

Grâce à la méthode pull de la programmation réactive, le consommateur décide quand la source envoie le prochain élément, évitant ainsi un gros tampon. Cependant, le problème n’est que déplacé, car la source peut ne jamais être entièrement traitée par un consommateur en retard. Il est possible d’appliquer cette méthode sur une source dite froide : émets toute sa séquence d’éléments à un consommateur depuis le début, et à la demande de ce dernier. Par exemple une série de nombres entre 1 et 10, le résultat d’une base de données, ou la lecture d’un fichier.

Tandis qu’avec une source chaude, les éléments sont émis sans attendre une quelconque demande du consommateur. C’est la méthode push qui pousse les données aux consommateurs. Ceux-là suivent le rythme, de l’évènement d’une souris et d’un clavier, d’un flux vidéo en direct, ou d’un chat. Le consommateur se verra appliquer une contre-pression différente du pull. Il peut mettre en tampon un certain nombre d’éléments, et supprimer ceux qui sont en trop. Ou bien récupérer plusieurs éléments à la fois sur un intervalle court pour faire un traitement par lot. Il existe encore d’autres façons.

ReactiveStreams est un standard sur le traitement des données asynchrone avec contre-pression non bloquante. Ses nombreuses règles permettent une implémentation conforme. Elles sont utilisées par de nombreuses bibliothèques réactives, comme RxJava. Dans certains cas, la programmation réactive est moins performante que la programmation basique, mais qui s’embêterait à développer quand on possède tout ça ?

Laisser un commentaire