Un bref aperçu des systèmes réactifs

Il y a eu beaucoup de buzz sur les systèmes réactifs au cours des deux dernières années. Avec le buzz vient la collection de salades de mots-clés pertinents comme les flux réactifs, les extensions réactives, la programmation réactive, la programmation réactive fonctionnelle, etc. Si vous êtes dans l'industrie technologique depuis assez longtemps, vous avez vu les hauts et les bas cycliques des mots à la mode et acronymes de temps en temps. Alors, est-ce que tout cela est un autre battage publicitaire bientôt daté?

J'ai entendu des ingénieurs en logiciel rejeter les systèmes réactifs comme rien de plus qu'un alias pour les systèmes asynchrones basés sur des événements, un peu comme la façon dont certains considèrent les microservices comme SOA (architecture orientée services) moins ESB (bus de services d'entreprise). Alors que les mots à la mode de la technologie avec une signification réinventée apparaissent souvent, je vois suffisamment de traits distinctifs dans les systèmes réactifs pour penser que le nom n'est pas simplement un autre alias.

Que sont les systèmes réactifs?

Le Manifeste Réactif décrit les caractéristiques essentielles des systèmes réactifs: réactifs, résilients, élastiques et axés sur les messages. Cela donne une image de haut niveau et sonne un peu générique. En particulier, la réactivité, la résilience, l'élasticité décrites dans le manifeste sont des exigences presque standard de nombreuses applications du monde réel de nos jours.

Peut-être que «axé sur les messages» est l'exigence qui différencie vraiment les systèmes réactifs des autres. Sous le capot, un système réactif repose sur des interactions via la transmission de messages asynchrone qui établit des limites entre les composants individuels. Un tel modèle d'interaction permet d'ouvrir la voie vers un couplage lâche à la fois temporellement et géographique pour la concurrence et la distribuabilité, respectivement. De plus, cela permet au système d'être intégralement équipé d'un mécanisme non bloquant pour réguler les flux de données (plus d'informations ci-dessous).

Flux réactifs

Dans la construction de systèmes réactifs, il semble y avoir une approche prédominante dans laquelle les opérations de traitement des données sont, le cas échéant, formulées sous forme de flux de composition. Cela ne fait pas partie des exigences du manifeste réactif, mais cela pourrait être le modèle d'interaction inhérent aux messages dans les systèmes réactifs qui favorise naturellement une telle approche de modélisation centrée sur le flux.

Apparemment apparus comme une initiative distincte, les flux réactifs peuvent être considérés comme un type spécifique de systèmes réactifs centrés sur le traitement des flux, exprimant les flux de composition sous forme de graphiques dirigés.

Contre-pression

L'un des mécanismes de régulation non bloquants mentionnés précédemment est la contre-pression. Il s'agit peut-être de la fonctionnalité la plus recherchée pour les systèmes qui implémentent des flux réactifs. C'est un mécanisme de rétroaction asynchrone fonctionnant dans la direction opposée du flux vers les composants en amont pour la régulation de la charge.

Avec la contre-pression intégrée régulant les flux de flux de manière non bloquante, le système est capable de fonctionner avec des utilisations de mémoire relativement plus stables. Une telle fonctionnalité élimine les problèmes de débordement de pile potentiellement dévastateurs (par exemple causés par un puits de données lent) qui devraient généralement être contrés par un mécanisme de mise en mémoire tampon des données de création personnalisée tout au long des flux de flux.

Et la programmation réactive?

En tant que paradigme de programmation pour la construction de systèmes réactifs, la programmation réactive met l'accent sur la formulation de la logique de programmation asynchrone sous forme de flux de données et sur la propagation automatique des changements aux valeurs des variables corrélées dans le système. Les langages utilisés pour un tel paradigme de programmation fourniraient des fonctions composables appropriées pour fonctionner sur les flux formulés.

De par sa conception, la programmation réactive favorise le style de programmation fonctionnelle qui exprime et résout les problèmes de calcul à l'aide de fonctions composables. Néanmoins, l'existence du terme programmation réactive fonctionnelle est antérieure à ce «mouvement» réactif de plus d'une décennie. FRP a un objectif très différent et se concentre sur l'utilisation de fonctions pour exprimer des comportements sur un temps continu avec une sémantique de dénotation simple. Pourtant, il est maintenant souvent considéré comme une programmation réactive avec un accent explicite dans la programmation fonctionnelle.

Si une illustration avec du code fonctionne mieux, je recommande de lire le tutoriel d'Andre Staltz qui décrit l'essence de la programmation réactive en JavaScript à l'aide de RxJS.

ReactiveX

ReactiveX, alias Reactive Extensions, est une bibliothèque d'API qui permet l'utilisation d'opérations de composition pour gérer les flux d'événements asynchrones. S'étendant du modèle d'observateur, les observables et les observateurs (qui sont abonnés aux observables) constituent les ingrédients clés de la bibliothèque avec un ensemble d'opérateurs composables pour le filtrage, la transformation, l'agrégation, etc. RxJS et RxJava sont deux des implémentations les plus populaires de ReactiveX en JavaScript et Java respectivement.

Acteurs Akka

Akka est une bibliothèque basée sur les acteurs destinée à la création d'applications concurrentes et distribuées évolutives sur JVM (Java Virtual Machine). À la base se trouvent des primitives de calcul appelées acteurs qui maintiennent l'état et le comportement, et communiquent entre eux via une transmission de messages asynchrone.

Écrit en Scala, les acteurs d'Akka sont par nature légers et faiblement couplés. Cela, associé aux fonctionnalités robustes de routage, de partitionnement et de pub-sub d'Akka pour les systèmes distribués évolutifs tels que l'IoT, en fait une excellente plateforme pour la création de systèmes réactifs.

Flux Akka

Akka Streams est l'un des pionniers (et un membre fondateur) de l'initiative des flux réactifs. Il repose sur les acteurs Akka et fournit un ensemble complet d'API pour créer des topologies de flux et traiter des flux de manière hautement compositionnelle. Un article récent de mon blog se concentre sur les flux Akka et sur la façon dont il peut être utilisé pour effectuer une exploration de texte de base.

Apparemment, Akka streams comme une initiative réactive s'est efforcée ces jours-ci. Les pilotes basés sur Akka-Streams tels que Reactive Rabbit et ReactiveMongo pour RabbitMQ et MongoDB ont commencé à prendre de l'ampleur dans l'industrie technologique. En outre, Akka HTTP, qui est la prochaine génération de la boîte à outils Spray REST / HTTP, est également conçu pour être compatible avec les flux avec les flux Akka comme moteur sous-jacent.

Tous les flux sont orientés - d'une manière ou d'une autre

Avec l'élan sans cesse croissant dans l'adoption de l'initiative des systèmes réactifs, il a apparemment dépassé le stade d'être un simple battage médiatique. C'est aussi évidemment plus qu'un mot à la mode réinventé des systèmes asynchrones basés sur des événements. Du point de vue des mérites techniques, je ne vois aucune raison pour laquelle cela ne deviendra pas plus important. Néanmoins, même les initiatives technologiques open source ressemblent à des produits commerciaux - un bon timing peut rapidement attirer l'attention dans la phase initiale et un marketing approprié peut aider à gagner l'élan continu nécessaire pour vulgariser auprès de la base d'utilisateurs plus large.

En ce qui concerne le timing, la programmation fonctionnelle a augmenté, donc je dirais que c'est un bon timing, car le style de programmation est favorablement adopté dans la construction de systèmes réactifs. En ce qui concerne le marketing, je crois qu'une dénomination plus intuitive et révélatrice de l'initiative se vendrait mieux à l'industrie technologique. On pouvait difficilement saisir quoi que ce soit de significatif en entendant le terme «systèmes réactifs» pour la première fois. Bien que le terme «réactif» aborde certains aspects de la propagation du changement dans de tels systèmes, il ne saute pas aux yeux du public en tant que caractéristique de signature.

Avec des systèmes réactifs, des flux réactifs et une programmation réactive principalement orientée autour des flux, je pense que le terme «flux» est un mot-clé plus révélateur que «réactif». Échange de généralité avec simplicité et intuition, je combinerais des systèmes réactifs et des flux réactifs en une seule initiative, et remplacerais «réactif» par quelque chose qui se concentre sur le «flux».