72 votes

Spring MVC (async) vs Spring WebFlux

J'essaie de comprendre Spring WebFlux. Les choses que j'ai trouvées jusqu'à présent sont réactives à la base, pas de Servlet API, pas de thread par requête, HTTP 2, server pushes, application/stream+json.

Mais quelle est la différence entre les appels asynchrones dans Spring MVC ? Je veux dire que dans Spring MVC, lorsque vous renvoyez Future, DefferedResult, etc., la logique du gestionnaire de requêtes (méthode du contrôleur) est exécutée dans un thread séparé, ce qui vous permet d'économiser les ressources du pool de threads pour la répartition des requêtes.

Pourriez-vous donc mettre en évidence les différences liées à cela ? Pourquoi WebFlux est-il meilleur ici ?

Merci beaucoup pour votre temps !

4 votes

La programmation réactive est axée sur la poussée et utilise un seul fil de distribution (ce qui est très efficace), alors que l'ancien modèle est toujours limité au nombre de fils de votre pool de fils.

0 votes

@M. Deinum Mais dans ce cas, je suis limité par la charge qu'un seul fil peut gérer. Pourquoi ne pas en utiliser plusieurs, et non pas un seul sur un système multicœur ?

1 votes

C'est un fil distributeur d'événements, c'est un modèle entièrement différent. Il ne fait que distribuer des événements (très rapidement) alors que l'autre modèle est toujours bloquant.

55voto

Brian Clozel Points 6473

Le modèle asynchrone de Servlet introduit une frontière asynchrone entre les threads du conteneur (modèle 1 Servlet request/thread) et le traitement de la demande dans votre application. Le traitement peut se faire sur un autre thread ou attendre. En fin de compte, vous devez renvoyer la requête à un thread du conteneur et lire/écrire de manière bloquante ( InputStream et OutputStream sont par nature des API bloquantes).

Avec ce modèle, vous avez besoin de nombreux threads pour obtenir la simultanéité (car beaucoup d'entre eux peuvent être bloqués en attendant les E/S). Cela coûte des ressources et peut être un compromis, en fonction de votre cas d'utilisation.

Avec un code non bloquant, vous n'avez besoin que de quelques threads pour traiter un grand nombre de demandes simultanément. Il s'agit d'un modèle de concurrence différent ; comme tout modèle, il présente des avantages et des inconvénients.

Pour plus d'informations sur cette comparaison, ce Discussion sur les piles servlet et réactives devrait être intéressant.

0 votes

D'après ce que je comprends, un autre avantage serait le contenu de la réponse elle-même. Un éditeur (Flux/Mono) est considéré comme plus "avancé" qu'un Future, car il permet de mieux contrôler le flux, par exemple la contre-pression, etc.

1 votes

Pouvez-vous nous éclairer ? Même pour le webFlux réactif, nous devons attendre l'écriture sur le socket. Si je comprends bien, dans le cas d'Asyc servlet api, le thread du conteneur doit passer la requête dans le threadPool de l'application pour attendre le travailleur libre et après avoir passé le thread devient libre et peut être réutilisé pour d'autres requêtes juste après avoir passé cette requête. Pourquoi dites-vous que Avec ce modèle, vous avez besoin de plusieurs threads pour obtenir la simultanéité. ?

0 votes

@gstackoverflow Nous avons parfois besoin d'attendre pour écrire/lire sur un socket, mais de manière non bloquante - dans ce cas, aucun thread ne reste inactif pendant ce temps. Avec le modèle Servlet 3.0, le nombre de threads du serveur est proportionnel au nombre maximal de requêtes simultanées. Regardez la conférence que je vous ai indiquée, tout cela y est expliqué en détail.

9voto

Javed Points 129

L'API des servlets est une entrée/sortie bloquante qui nécessite un thread par requête HTTP. L'asynchronisme de Spring MVC repose sur les API des servlets, qui n'offrent un comportement asynchrone qu'entre les threads du conteneur et les threads de traitement des demandes, mais pas de bout en bout.

Spring WebFlux, quant à lui, permet d'atteindre la concurrence par un nombre fixe de threads en utilisant des sockets HTTP et en poussant des morceaux de données à la fois à travers les sockets. Ce mécanisme est appelé boucle d'événement une idée rendue populaire par Node.js . Une telle approche est évolutive et résiliente. Le spring-webflux de Spring 5 utilise la fonction boucle d'événement pour fournir un comportement asynchrone.

Pour en savoir plus, voir

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X