web-dev-qa-db-fra.com

Spring MVC (asynchrone) vs Spring WebFlux

J'essaie de comprendre Spring WebFlux. Les choses que j'ai trouvées jusqu'à présent sont réactives au coeur, pas d'API Servlet, pas de thread par requête, HTTP 2, push du serveur, application/stream + json.

Mais quelle est la différence entre les appels asynchrones dans Spring MVC? Je veux dire dans Spring MVC lorsque vous renvoyez Future, DefferedResult, etc., vous obtenez une logique dans le gestionnaire de demandes (méthode du contrôleur) exécuté dans un thread séparé. Vous pouvez ainsi bénéficier de la sauvegarde des ressources du pool de threads pour la distribution des demandes.

Alors pouvez-vous s'il vous plaît souligner les différences liées à cela? Pourquoi WebFlux est-il meilleur ici?

Merci beaucoup pour votre temps!

41
Dmitry Senkovich

Le modèle asynchrone Servlet introduit une limite asynchrone entre les threads de conteneur (1 requête/modèle de servlet de servlet) et le traitement de la requête dans votre application. Le traitement peut avoir lieu sur un autre thread ou attendre. En fin de compte, vous devez renvoyer dans un thread de conteneur et lire/écrire de manière bloquante (InputStream et OutputStream bloquent de manière inhérente les API).

Avec ce modèle, vous avez besoin de plusieurs threads pour obtenir une concurrence (car beaucoup d'entre eux peuvent être bloqués en attente d'E/S). Cela coûte des ressources et peut être un compromis, selon votre cas d'utilisation.

Avec du code non bloquant, vous n'avez besoin que de quelques threads pour traiter simultanément de nombreuses demandes. C'est un modèle de concurrence différent. comme tout modèle, il y a des avantages et des compromis à venir.

Pour plus d'informations sur cette comparaison, this Servlet contre les piles réactives devrait vous intéresser.

37
Brian Clozel