73 votes

Pourquoi node.js ne traite-t-il que six requêtes à la fois?

Nous avons un node.js serveur qui implémente une API REST comme un proxy sur un serveur central qui est un peu différent, et, malheureusement, asymétrique API REST.

Notre client qui opère dans différents navigateurs, demande le nœud de serveur pour obtenir les tâches à partir du serveur central. Le nœud du serveur obtient une liste de tous les id de tâche à partir de la centrale et les renvoie au client. Le client fait alors deux autres appels de l'API par l'id via le proxy.

Aussi loin que je peux dire, ce genre de choses est fait de manière asynchrone. Dans le journal de la console, ça ressemble à ça quand je lance le client:

Requested GET URL under /api/v1/tasks/*: /api/v1/tasks/

Cela prend quelques secondes pour obtenir la liste à partir du serveur central. Dès qu'il reçoit la réponse, le serveur barfs ce très rapidement:

Requested GET URL under /api/v1/tasks/id/:id :/api/v1/tasks/id/438
Requested GET URL under /api/v1/workflow/id/:id :/api/v1/workflow/id/438
Requested GET URL under /api/v1/tasks/id/:id :/api/v1/tasks/id/439
Requested GET URL under /api/v1/workflow/id/:id :/api/v1/workflow/id/439
Requested GET URL under /api/v1/tasks/id/:id :/api/v1/tasks/id/441
Requested GET URL under /api/v1/workflow/id/:id :/api/v1/workflow/id/441

Ensuite, à chaque fois une paire de ces demandes obtient un résultat à partir du serveur central, l'autre de deux lignes est barfed très rapidement.

Il semble donc que notre node.js le serveur est seulement disposé à avoir six requêtes à la fois.

165voto

josh3736 Points 41911

Il n'y a pas de connexion TCP limites imposées par le Nœud lui-même. (Le point est qu'il est très simultanées et peut gérer des milliers de connexions simultanées.) Votre système d'exploitation peut limiter les connexions TCP.

Il est plus probable que vous êtes frapper une sorte de limitation de votre serveur d'arrière-plan, ou vous êtes de frapper la builtin HTTP bibliothèque limite de connexion, mais c'est difficile à dire sans plus de détails sur ce serveur ou votre Nœud de mise en œuvre.

Nœud intégré HTTP bibliothèque (et bien évidemment, les bibliothèques construit sur le haut de, qui sont la plupart) maintient un pool de connexion (via l' Agent de la classe) afin de pouvoir utiliser les connexions HTTP persistantes. Cela permet d'accroître les performances lorsque vous êtes en cours d'exécution nombre de demandes vers le serveur: plutôt que d'ouvrir une connexion TCP, de faire une requête HTTP, d'obtenir une réponse, la fermeture de la connexion TCP, et de répéter; de nouvelles demandes peuvent être émis sur réutilisé les connexions TCP.

Par défaut, l'adresse HTTP de l'Agent ne s'ouvrent qu'à 5 connexions simultanées à un seul hôte. Vous pouvez facilement modifier ce: (en supposant que vous avez required le module HTTP comme http)

http.globalAgent.maxSockets = 20; // or whatever

Vous souhaitez probablement garder une sorte de limite de connexion en place. Vous ne voulez pas complètement submerger votre serveur d'arrière-plan avec des centaines de requêtes HTTP en vertu d'une deuxième performance sera probablement pire que si vous laissez l'Agent du pool de connexions en faire sa chose, la limitation des demandes afin de ne pas surcharger votre serveur. Votre meilleur pari sera de lancer quelques expériences pour voir ce que le nombre optimal de demandes simultanées est dans votre situation.

Toutefois, si vous ne voulez vraiment pas le regroupement de connexion, vous pouvez tout simplement ignorer la piscine entièrement envoyée agent de false de la demande options:

http.get({host:'localhost', port:80, path:'/', agent:false}, callback);

Dans ce cas, il n'y aura absolument pas de limite sur les requêtes HTTP.

16voto

Almo Points 3815

C'est la limite sur le nombre de connexions simultanées dans le navigateur:

Combien simultanées AJAX (XmlHttpRequest) les demandes sont autorisées dans les navigateurs populaires?

J'ai upvoted les autres réponses, car ils m'ont aidé à diagnostiquer le problème. L'idée était que le nœud de la limite de prise est de 5, et je commençais à 6 à la fois. 6 est la limite en Chrome, qui est ce que j'ai utilisé pour tester le serveur.

8voto

Brandon Tilley Points 49142

Comment êtes-vous d'obtenir des données à partir du serveur central? "Le noeud n'a pas de limite de connexions" n'est pas entièrement exacts au moment de la création de requêtes HTTP avec l' http module. Client les demandes faites dans cette façon d'utiliser l' http.globalAgent instance de http.Agent, et chaque http.Agent a un réglage appelé" maxSockets qui détermine le nombre de sockets, l'agent peut ouvrir sur un hôte donné; la valeur par défaut est 5.

Donc, si vous êtes en utilisant http.request ou http.get (ou une bibliothèque qui s'appuie sur ces méthodes) pour obtenir des données à partir de votre serveur central, vous pouvez essayer de modifier la valeur de http.globalAgent.maxSockets (ou de modifier ce paramètre sur n'importe quel exemple de http.Agent que vous utilisez).

Voir:

1voto

disjunction Points 514

Êtes-vous sûr que cela renvoie simplement les résultats au client? Le noeud traite tout dans un thread. Donc, si vous faites une analyse de réponse sophistiquée ou toute autre chose qui ne donne pas, alors toutes vos requêtes seront bloquées.

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