2017-07-03 2 views
0

Nous avons un simple serveur de nœud express déployé sur Windows Server 2012 qui reçoit les requêtes GET avec seulement trois paramètres. Il effectue un traitement mineur sur ces paramètres, possède un cache-cache en mémoire très simple pour mettre en cache certaines de ces combinaisons de paramètres, des interfaces avec un serveur de licences externe pour extraire la licence de l'utilisateur demandeur et la définir dans le cookie. , il s'interface avec certains travailleurs via un équilibreur de charge (en cours d'exécution avec zmq) pour télécharger des fichiers volumineux (en morceaux, les décompresser et les extraire, les écrit dans certains répertoires) et les afficher à l'utilisateur. Lors du déploiement de ces fichiers, d'autres appels aux travailleurs sont également initiés.un message simple passe serveur NodeJS accepter seulement 4 demandes à un moment

Le serveur de noeud ne communique avec aucune base de données ou disque. Il attend simplement une réponse de l'équilibreur de charge s'exécutant sur d'autres machines (il s'agit généralement de longues opérations entre 2-3 minutes pour envoyer une réponse). Donc, essentiellement, les interactions de calcul et de base de données se produisent sur d'autres machines. Le serveur de noeud n'est qu'un simple serveur de transmission/d'échange de messages qui attend une réponse dans les gestionnaires d'événements, initie d'autres demandes et restitue la réponse.

Nous n'utilisons un module 'de cluster' ou nginx au moment. Avec un simple serveur de nœuds, est-il possible d'accepter et de traiter au moins 16 demandes simultanément? Des pages telles que celles-ci http://adrianmejia.com/blog/2016/03/23/how-to-scale-a-nodejs-app-based-on-number-of-users/ mentionnent qu'un serveur de noeud simple peut gérer seulement 2 à 9 requêtes à la fois. Mais même avec notre implémentation de bare bones, pas plus de 4 requêtes sont acceptées à la fois.

utilise un module de cluster ou nginx nécessaire, même dans ce cas? Comment redimensionner cette application pour quelques centaines d'utilisateurs pour commencer?

+1

Si pas plus de 4 demandes sont acceptées à un moment, il semble que votre application est en cours d'exécution dans une sorte de limitation imposée (comme un pool de connexion qui est en cours d'exécution de connexions et d'attente pour une connexion à libérer). Il y a trop de parties mobiles dans votre histoire pour identifier un coupable, mais commencez par enlever des parties de votre gestionnaire de requêtes pour voir lequel peut causer le bloc (aussi, le blog que vous liez ne mentionne pas qu'un seul serveur Node peut gérer seulement 2-9 demandes à la fois). – robertklep

Répondre

1

Un serveur Express peut gérer beaucoup plus de 9 demandes à la fois, surtout si elle ne parle pas à un datebase.

L'article que vous faites référence suppose un certain accès à la base de chaque demande et au service des actifs statiques par nœud lui-même, plutôt que d'un CDN. Tout cela se passe sur un seul processeur avec 1 Go de RAM. C'est une base de données et un serveur web fonctionnant sur un seul noyau avec un minimum de RAM.

Il n'y a vraiment pas de chiffres précis sur ce genre de chose; Vous le construisez et voyez comment il fonctionne. Si cela ne fonctionne pas assez bien, placez un proxy inverse devant lui comme nginx ou haproxy pour faire l'équilibrage de charge. Toutefois, en fonction de votre problème, si vous êtes confronté à des goulots d'étranglement où seulement 4 connexions sont possibles à la fois, il semble que vous gardiez ces connexions trop longtemps et en bloquiez d'autres. Mieux vaut lancer ces processus de longue durée par nœud, fermer les connexions, puis demander à ces serveurs de rappeler quand ils auront fini.

+0

a du sens. mais, ce que nous faisons est de créer un socket req zmq pour presque chaque requête (sauf si elle est déjà mise en cache). Et attendez une réponse sur cette socket dans socket.on ('message'). Quand vous dites «fermez les connexions» et que les employés rappellent quand ils ont fini, comme un modèle «fire and forget», comment l'implémenter avec les sockets zmq? – svk

+0

Cela dépasse le cadre de la question initiale. – Soviut