Quelle est la différence entre le connecteur BIO de Tomcat et le connecteur NIO?

Je voudrais connaître les composants internes du connecteur Tomcat NIO. Dans quelle mesure les threads sont-ils utilisés lorsque nous créons un servlet qui implémente CometProcessor? Est-ce toujours un thread par connexion?

D’après ce que j’ai lu, la conversation se déroule comme ceci

  1. Le client se connecte à un servlet

  2. Servlet se bloque sur la connexion jusqu’à ce qu’il y ait des données disponibles pour le client connecté

  3. Lorsque les données sont prêtes, le serveur écrit dans httpResponse et les vide. Cela déconnecte réellement la connexion?

  4. Le client envoie une autre requête sur laquelle le serveur se bloque à nouveau.

Combien de threads sont utilisés lorsque cela se produit?

NIO et Comet n’ont aucun lien: vous pouvez les combiner.

L’utilisation du connecteur NIO (ou APR pour d’ailleurs) vous permet de gérer plus de demandes avec moins de threads en raison du modèle de threading. Voir http://tomcat.apache.org/tomcat-7.0-doc/config/http.html#Connector_Comparison pour une comparaison entre les connecteurs.

Comet (et Websocket) ont un modèle de répartition complètement différent qui nécessite une architecture d’application différente et permet un débit plus élevé d’une manière différente.

Le scénario que vous posez dans votre question est le modèle de blocage par thread par requête typique. A l’étape 4, le connecteur Java BIO (par défaut via Tomcat 7) continuera d’attendre des requêtes supplémentaires sur le connecteur existant – pour les requêtes HTTP keepalive. Si le client ne définit pas Connection:close sur la requête précédente et ne ferme pas la connexion, le thread se bloque jusqu’à ce que le délai de keepalive soit atteint. Si vous utilisez le connecteur NIO, le thread retournera dans le pool de threads immédiatement après l’envoi de la réponse et vous ne “gaspillerez” pas un thread sur les requêtes keepalive qui pourraient ne jamais arriver.

Comet / Websocket fonctionne complètement différemment en envoyant un message à une servlet spécialement écrite (et des filtres facultatifs) et les threads ne sont utilisés que lorsque des messages sont envoyés ou que des données doivent être écrites.

MISE À JOUR 2016-08-19

Tomcat 8.5 et 9.0 ont complètement supprimé le connecteur BIO. Cela est dû au fait que de nombreuses nouvelles API et technologies (par exemple Websocket) nécessitent une sémantique non bloquante, et la création d’un service non bloquant au-dessus d’une API bloquante est très difficile. Le code requirejs pour effectuer le travail était de rendre le rest du code Tomcat très moche, etc. Il a donc été décidé de supprimer complètement le connecteur BIO. Ainsi, pour Tomcat 8.5 et les versions ultérieures, seuls les connecteurs NIO, NIO2 et APR sont disponibles.

Notez que, même avec Tomcat 8.5 et 9.0, la prise en charge de Comet a été supprimée. Les utilisations de Comet devraient toutes être remplacées par Websocket, qui est un protocole plus standard.

NIO utilise moins de thread, cela signifie que le port TCP / IP est moins utilisé.

Vous savez que le port est 1 à 65534, nous pouvons donc dire que NIO peut atteindre un TPS plus élevé (Transactions par seconde) que BIO

J’ai testé les deux protocoles :HTTP/1.1 et org.apache.coyote.http11.Http11NioProtocol avec le même projet Web, le même hôte et le même server.xml que le protocole.

Utilisez jmeter pour le test.

Je mets 1000 thread à exécuter la demande, quand HTTP / 1.1 en quelques minutes, le port d’utilisation d’hôte est supérieur à 30000 et le TPS à 300 seulement!

Lorsque org.apache.coyote.http11.Http11NioProtocol, le nombre maximal de ports d’utilisation n’est jamais dépassé de 3000 et le tps est supérieur à 1200!

Ajout tardif à cette discussion – Dans ce contexte de comparaisons de performances entre IO bloquant et NIO asynchrone – une excellente lecture est “L’ancienne méthode d’écriture des serveurs est nouvelle” . En résumé, le thread par modèle de connexion s’est avéré plus performant et plus facile à écrire que la version NIO – contrairement à la croyance populaire.

Voici deux bons articles sur le connecteur NIO au cas où cela aiderait une personne prenant en compte les différences entre BIO (le traitement des demandes est tenu d’accepter les threads) et NIO (le traitement des requêtes est transmis à un autre thread de travail).

  • Connecteur NIO via le site expert Tomcat
  • Vue d’ensemble des connecteurs Tomcat (PDF)