- 
                Notifications
    You must be signed in to change notification settings 
- Fork 4
Article/programation reactive #117
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 12 commits
bfcce68
              0bd8779
              35954c3
              a801e7c
              d35d23a
              bff319f
              4e48fa5
              40f8bcb
              ea0822c
              2e62e3b
              a66f387
              de6289a
              eebacda
              f6b15cb
              e29317a
              5af4651
              b93b86c
              e99a5dd
              7e3f80a
              72d16c1
              667e85a
              73964eb
              2728e1e
              6cf9ae9
              cd31414
              bc7dc6d
              5e9545c
              a59dfc5
              946323e
              d1754b6
              57e2808
              File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,189 @@ | ||||||
| = La programmation réactive avec Reactor Spring web Flux | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
| :showtitle: | ||||||
| :page-navtitle: La programmation réactive avec Reactor Spring web Flux | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
| :page-excerpt: | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
| :layout: post | ||||||
| :author: khairikhadhraoui | ||||||
| :page-tags: | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
| :page-vignette: programation-reactive.jpg | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
| :page-liquid: | ||||||
| :page-categories: software news | ||||||
|  | ||||||
| == Introduction: | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Show resolved
            Hide resolved | ||||||
|  | ||||||
| Pendant longtemps, la programmation Java a été dominée par un modèle synchrone et bloquant. Cependant, l'évolution des architectures logicielles, notamment l'émergence des microservices et du cloud computing, a mis en évidence les limites de ce modèle. Pour répondre à ces nouveaux défis, un nouveau paradigme a vu le jour : la programmation réactive en s'appuyant sur le Reactive Manifesto, offre une solution robuste et performante pour mettre en œuvre des applications réactives en Java. | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| Pour explorer la programmation réactive, il est utile de comprendre les systèmes non réactifs traditionnels et leurs inconvénients, en particulier en ce qui concerne l'utilisation des ressources et la gestion des événements. | ||||||
|  | ||||||
| Les systèmes non réactifs, aussi appelés systèmes synchrones ou bloquants, sont les approches traditionnelles utilisées dans la programmation. Voici quelques caractéristiques clés{nbsp}: | ||||||
|  | ||||||
|  | ||||||
| * Traitement séquentiel Une tâche doit généralement attendre la fin de l'exécution de la tâche précédente avant de commencer, | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| * Blocage des ressources : Les systèmes non réactifs bloquent souvent des ressources (comme des threads ou des connexions réseau) en attendant des résultats, | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| * Gestion des événements complexes : La gestion des événements dans les systèmes non réactifs peut devenir complexe et difficile à maintenir, surtout lorsque le nombre d'événements augmente | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| * Latence élevée : En raison de la nature bloquante de ces systèmes, ils peuvent entraîner une latence élevée, surtout dans les applications où la rapidité de réponse est cruciale. | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| * Scalabilité limitée : Comme chaque requête ou tâche peut nécessiter son propre thread ou processus, l'augmentation du nombre de requêtes peut rapidement saturer les ressources du système | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| Pour surmonter ces limitations, les systèmes réactifs offrent une alternative en se concentrant sur l'asynchronisme, la non-bloquante, et l'efficacité dans l'utilisation des ressources. Ils permettent de créer des applications qui sont plus réactives, plus résilientes, et plus scalables, en répondant efficacement aux événements et en utilisant les ressources de manière optimale. | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| == Principes programmation réactive | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| Les principes de la programmation réactive sont encapsulés dans le "Manifeste Réactif", qui énonce quatre caractéristiques clés{nbsp}: | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| * Responsive (Réactif) : Les systèmes réactifs répondent rapidement aux utilisateurs pour garantir une expérience fluide et interactive. | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| * Resilient (Résilient) : Les systèmes réactifs restent opérationnels même en cas de défaillance, grâce à des mécanismes de gestion des erreurs et de redondance. | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| * Elastic (Élastique) : Les systèmes réactifs s'adaptent aux variations de la charge de travail en allouant dynamiquement les ressources nécessaires. | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| * Message-Driven (Basé sur les Messages) : Les systèmes réactifs communiquent par la transmission de messages asynchrones, facilitant la déconnexion et le découplage des composants. | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| == Standard de la programmation réactive | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| Les standards de la programmation réactive sont basés sur deux modèles{nbsp}: | ||||||
|  | ||||||
| * ReactiveX: ReactiveX à été conçu pour fournir une API unifiée pour le traitement de collections asynchrones, en s'inspirant des méthodes des collections synchrones (comme map, filter, reduce). Il est souvent utilisé pour gérer des événements utilisateur, des requêtes réseau, et d'autres opérations asynchrones dans des applications interactives. Ces implémentations connues sont : RxJava et RxJs. | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| * Reactive Streams: Reactive Streams a été créé pour résoudre des problèmes spécifiques de backpressure dans les systèmes de traitement de données asynchrones, en définissant un ensemble minimal d'interfaces pour garantir une gestion cohérente et efficace des flux de données entre différentes bibliothèques réactives dans l'écosystème JVM. Ces implementation connues sont Akka Reactor Vertex et RxJAVA2 | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| Dans notre article, on va s'intéresser à Reactor qui est une implémentation de Reactive streams. | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| Les objectifs principaux de Reactive Streams sont {nbsp}: | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| * Asynchronisme : Gérer les flux de données de manière non bloquante et asynchrone. | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| * Backpressure : Introduire une rétropression pour permettre aux consommateurs de signaler aux producteurs leur capacité à traiter les données, évitant ainsi les surcharges. | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| * Interopérabilité : Fournir une interface standard pour que différentes bibliothèques réactives puissent fonctionner ensemble. | ||||||
| There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 
        Suggested change
       
 | ||||||
|  | ||||||
| Interfaces principales de Reactive Streams {nbsp}: | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| * Publisher<T> : Représente une source qui peut émettre une séquence de valeurs asynchrones. Les éditeurs appellent la méthode subscribe() pour permettre aux abonnés de recevoir les éléments. | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| * Subscriber<T> : Représente un consommateur de données. Il reçoit les éléments émis par un Publisher via quatre méthodes : onSubscribe(), onNext(), onError(), et onComplete(). | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| * Subscription : Gère le lien entre un Publisher et un Subscriber. Elle permet de demander des éléments (request(long n)) ou d'annuler la souscription (cancel()). | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| * Processor<T, R> : Combine les fonctionnalités d'un Publisher et d'un Subscriber. Un Processor reçoit des éléments, les traite, et les renvoie sous forme d'un autre flux. | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| == Project Reactor : | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| Reactor est une bibliothèque réactive pour Java développée par Pivotal (maintenant VMware) et intégrée dans l'écosystème Spring. Elle fournit une implémentation de Reactive Streams et permet de construire des applications non bloquantes, asynchrones, et scalables. Reactor est au cœur de Spring WebFlux, le module réactif de Spring Framework. | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| Les principales abstractions fournies par Reactor sont {nbsp}: | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| * Mono<T> : Représente un flux réactif qui produit au maximum une seule valeur ou une erreur. | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| * Flux<T> : Représente un flux réactif qui peut émettre zéro, une ou plusieurs valeurs, voire un flux infini. | ||||||
|         
                  khadraoui marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||||||
|  | ||||||
| Ces deux types sont les composants de base utilisés pour modéliser des flux de données asynchrones en Java avec Reactor. | ||||||
|  | ||||||
| En pratique un Flux peut être sérialisé sous plusieur formes {nbsp}: | ||||||
|          | ||||||
| En pratique un Flux peut être sérialisé sous plusieur formes {nbsp}: | |
| En pratique un `Flux` peut être sérialisé sous plusieurs formes{nbsp}: | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ne faudrait il pas préciser des type mimes pour chaque forme ??
        
          
              
                  khadraoui marked this conversation as resolved.
              
              
                Outdated
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
              
                Outdated
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
              
                Outdated
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
              
                Outdated
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
              
                Outdated
          
            Show resolved
            Hide resolved
        
      There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
il faudrait ajouter une petite phrase du genre : "Spring WebFlux propose plusieurs fonctionnalités principales : "
        
          
              
                  khadraoui marked this conversation as resolved.
              
              
                Outdated
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
              
                Outdated
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
              
                Outdated
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
              
                Outdated
          
            Show resolved
            Hide resolved
        
      There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Il faudrait ajouter une phrase du genre "L'utilisation de Spring WebFlux présente plusieurs avantages : "
        
          
              
                Outdated
          
        
      There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| * Scalabilité : La nature non-bloquante permet de gérer un grand nombre de connexions simultanées avec moins de threads. | |
| * Scalabilité : la nature non-bloquante permet de gérer un grand nombre de connexions simultanées avec moins de threads. | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
il y a tout même un gros bémol pour que cela soit vraie dont tu ne parles pas
        
          
              
                  khadraoui marked this conversation as resolved.
              
              
                Outdated
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
              
                Outdated
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
              
                Outdated
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
              
                Outdated
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
              
                Outdated
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
              
                Outdated
          
            Show resolved
            Hide resolved
        
      There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Que se passe t-il en cas d'erreur ? comment gérer une erreur ?
        
          
              
                  khadraoui marked this conversation as resolved.
              
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
              
                Outdated
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
              
                Outdated
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
              
                Outdated
          
            Show resolved
            Hide resolved
        
              
          
              
                  khadraoui marked this conversation as resolved.
              
          
            Show resolved
            Hide resolved
        
              
          
              
                Outdated
          
        
      There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ils sont déjà là (en Java : thread virtuels et structured concurrency (en preview)) mais pour remplacer la programmation réactive qui a de très gros défauts.
Sans en avoir un bonne connaissance, c'est la garantie de plus d'ennuis que de gain sur la mise en oeuvre (ce qui est fréquemment le cas).
Pour apporter un peu plus de valeur à cette article, il faudrait ajouter une partie à ce sujet.
Uh oh!
There was an error while loading. Please reload this page.