36 votes

Fiabilité de Node.js pour les grandes applications

Je suis nouvelle Node.js et je suis actuellement remettent en cause sa fiabilité.

Selon ce que j'ai vu jusqu'à présent, il semble y avoir un défaut majeur: toute erreur non interceptée/exceptions plante le serveur. Bien sûr, vous pouvez essayer à l'épreuve des balles de votre code ou mettre try/catch dans des domaines clés, mais il y aura presque toujours des bugs qui glisser à travers la fissure. Et il semble dangereux si une requête qui pose problème pourrait affecter tous les autres demandes. Il y a 2 solutions de contournement que j'ai trouvé:

  1. L'utilisation de démon ou d'un module comme jamais pour redémarrer automatiquement le serveur quand il se bloque. La chose que je n'aime pas c'est que le serveur est toujours enfoncé pendant une seconde ou deux (pour un site de grande taille, qui pourraient être des centaines (des milliers?) de la demande).

  2. Attraper les exceptions non traitées à l'aide de process.on('uncaughtException'). Le problème avec cette approche (pour autant que je sais) c'est qu'il n'existe aucun moyen pour obtenir une référence à la demande qui provoque l'exception. De sorte que la demande en question est laissée en suspens (utilisateur voit l'indicateur de chargement jusqu'à ce délai d'attente). Mais au moins, dans ce cas, d'autres non problématique demandes peuvent être manipulés.

Peut importe Node.js vétéran de la hauteur dans des?

4voto

zzen Points 676

Pour le redémarrage automatique et de la charge ballancing, je vous suggère de vérifier Learnboost est ballancer.

Il vous permet de recharger un travailleur derrière le load-balancer sans tomber toutes les demandes. Il s'arrête de diriger les nouvelles demandes vers le travailleur, mais pour les demandes existantes qui sont déjà servis, il fournit workerTimeout de la période de grâce à attendre pour les demandes de finition avant de vraiment arrêter le processus.

Vous pouvez adapter cette stratégie être également déclenchée par l' uncaughtException événement.

2voto

eBusiness Points 2533

Vous avez le plein contrôle du processus de base, et qui est une caractéristique.

Si vous comparez Nœud à un Apache/PHP installation de ce dernier est vraiment juste équivalent à un simple Nœud de serveur qui envoie chaque demande entrante à son propre processus qui se termine après que la demande a été traitée.

Vous pouvez faire que le programme d'installation du Nœud si vous le souhaitez, et dans de nombreux cas, quelque chose comme ça, c'est probablement une bonne idée. La grande chose au sujet de Nœud, c'est que vous pouvez briser ce schéma, vous pourriez, par exemple, le processus principal ou d'un autre processus permanent ne le gestionnaire de session avant qu'une demande est transmis au gestionnaire.

Le noeud est un outil très flexible, ce qui est bon si vous avez besoin de cette flexibilité, mais il faut une certaine habileté à manipuler.

1voto

drudru Points 2101

Les exceptions ne font pas planter le serveur, elles lèvent des exceptions.

Les erreurs dans node.js qui entraînent la perte de l'ensemble du processus sont d'une autre histoire.

Votre meilleur pari (que vous devriez faire avec n'importe quelle technologie) est simplement de le tester avec votre application dès que possible pour voir si elle vous convient.

1voto

Marshall Points 2498

Une exception non interceptée sera, si pas pris, le crash du serveur. Quelque chose de semblable à l'appel d'un mal orthographié fonction. J'utilise process.on('uncaughtException') de la capture de ces exceptions. Si vous utilisez ce alors, oui, l'erreur envoyé à process.on('uncaughtException') est moins informatif.

J'ai l'habitude d'inclure un module de type nomnom pour permettre options de ligne de commande. - Je inclure un appelé --exceptions qui, lorsqu'elle est définie, contourne process.on('uncaughtException'). En gros, si je vois que les exceptions sont ce qui se passe alors je, dans le développement, le démarrage de l'application, d' --exceptions , de sorte que, lorsque cette erreur est déclenchée, il ne sera pas capturé, ce qui provoque Nœud à cracher la trace de la pile, puis meurent. Cela vous indique quelle ligne c'est arrivé, et dans ce fichier.

Capturer les exceptions est un moyen de traiter avec elle. Mais, comme vous l'avez dit, cela signifie que si une erreur se produit, il peut entraîner des utilisateurs de ne pas recevoir de réponses, et cetera. En fait, je peux vous recommandons de laisser l'erreur de planter le serveur. (J'utilise process.on('uncaughtException') dans les applications, pas des serveurs web). Et à l'aide de forever. Le fait est que c'est probablement mieux pour le serveur à crash et d'exposer ce que vous avez besoin pour réparer.

Disons que vous avez utilisé PHP au lieu de Nœud. PHP n'a pas brusquement crash le serveur (car il ne sert pas vraiment). Il crache vraiment laid erreurs. Bien sûr, il ne risque pas d'entraîner un serveur entier allant vers le bas et puis d'avoir à remonter à la surface. Personne ne veut de leurs clients d'avoir de temps mort. Mais cela signifie aussi qu'un problème va persister et seront moins visibles. Nous avons tous vu des sites qui ont dit des erreurs, et ils ne reçoivent pas corrigé très vite. Si un bogue ont été, de tout prendre vers le bas pour un petit blip (qui honnêtement ne soit pas que du mauvais dans l'ensemble), alors il serait certainement attirer l'attention à elle-même. Vous serait de voir les choses et permettrait de suivre l'insecte vers le bas.

Le fait est que les bugs existent dans tout système, indépendamment de la langue ou de la plate-forme. Et il est sans doute préférable pour eux d'être fatal pour vous de savoir qu'il s'est passé. Et au fil du temps, il vous amène à devenir plus conscients de la façon dont ces erreurs se produisent. Je ne sais pas pour vous, mais je sais que beaucoup de PHP devs qui font les mêmes erreurs courantes de temps après le temps.

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