web-dev-qa-db-fra.com

Qu'est-ce qui rend Node.js plus évolutif qu'Apache?

Pour être honnête, je ne l'ai pas encore complètement compris - et je comprends même comment fonctionne Node.js, en tant que thread unique utilisant le modèle d'événement. Je ne comprends pas comment c'est mieux qu'Apache, et comment il évolue horizontalement s'il est monothread.

73
MaiaVictor

J'ai trouvé que cet article de blog de Tomislav Capan l'explique très bien:
Pourquoi diable utiliserais-je Node.js? Une introduction au cas par cas

Mon interprétation de l'essentiel, pour Node 0.10, par rapport à Apache:

Les bonnes pièces

  • Node.js évite de faire tourner les threads pour chaque requête, ou n'a pas besoin de gérer le regroupement des requêtes vers un ensemble de threads comme le fait Apache. Par conséquent, il a moins de frais généraux pour gérer les demandes et excelle à répondre rapidement.
  • Node.js peut déléguer l'exécution de la demande à un composant distinct et se concentrer sur les nouvelles demandes jusqu'à ce que le composant délégué revienne avec le résultat traité. Il s'agit d'un code asynchrone, rendu possible par le modèle d'événement. Apache exécute les requêtes en série au sein d'un pool et ne peut pas réutiliser le thread lorsque l'un de ses modules attend simplement qu'une tâche soit terminée. Apache mettra ensuite les demandes en file d'attente jusqu'à ce qu'un thread du pool redevienne disponible.
  • Node.js parle JavaScript et est donc très rapide à traverser et à manipuler JSON récupéré à partir de sources API Web externes comme MongoDB, réduisant ainsi le temps nécessaire par requête. Les modules Apache, comme PHP, peuvent nécessiter plus de temps, car ils ne peuvent pas analyser et manipuler efficacement JSON car ils ont besoin de marshalling pour traiter les données.

Les mauvaises parties

Remarque: la plupart des mauvaises pièces répertoriées ci-dessous seront améliorées avec la prochaine version 0.12, quelque chose à garder à l'esprit. =

  • Node.js aspire aux tâches de calcul intensif , car chaque fois qu'il fait quelque chose de long, il mettra en file d'attente toutes les autres demandes entrantes, en raison de son unique thread. Apache aura généralement plus de threads disponibles, et le système d'exploitation planifiera soigneusement et équitablement le temps processeur entre ces threads, tout en permettant de gérer de nouveaux threads, bien qu'un peu plus lentement. Sauf lorsque tous les threads disponibles dans Apache traitent les demandes, Apache démarre également les demandes de mise en file d'attente.
  • Node.js n'utilise pas entièrement les processeurs multicœurs , sauf si vous créez un cluster Node.js ou faites tourner des processus enfants. Ironiquement, si vous faites les deux derniers, vous pouvez ajouter plus de surcharge d'orchestration, le même problème qu'Apache. Logiquement, vous pouvez également faire tourner plus de processus Node.js, mais cela n'est pas géré par Node.js. Vous devrez tester votre code pour voir ce qui fonctionne mieux; 1) multi-threading depuis Node.js avec des clusters et des processus enfants, ou 2) plusieurs processus Node.js.

Atténuation

Toutes les plateformes de serveurs ont une limite supérieure. Node.js et Apache y parviendront tous les deux à un moment donné.

  • Node.js l'atteindra le plus rapidement lorsque vous aurez de lourdes tâches de calcul.
  • Apache l'atteindra le plus rapidement lorsque vous lui lancerez des tonnes de petites requêtes qui nécessitent une longue exécution en série.

Trois choses que vous pourriez faire pour augmenter le débit de Node.js

  1. Utilisez des processeurs multicœurs , en configurant un cluster , utilisez processus enfants , ou utiliser un orchestrateur multi-processus comme Phusion Passenger .
  2. Configurez les rôles de travail connectés à une file d'attente de messages . Ce sera la solution la plus efficace contre les demandes de longue durée à forte intensité de calcul; les décharger dans une ferme de travailleurs. Cela divisera vos serveurs en deux parties; 1) des serveurs de bureau publics qui acceptent les demandes des utilisateurs et 2) des serveurs de travail privés qui gèrent des tâches de longue durée. Les deux sont connectés avec une file d'attente de messages. Les serveurs administratifs ajoutent des messages (requêtes entrantes de longue durée) à la file d'attente. Les rôles de travail écoutent les messages entrants, les gèrent et peuvent renvoyer le résultat dans la file d'attente des messages. Si une demande/réponse est nécessaire, le serveur de bureau peut attendre de manière asynchrone que le message de réponse arrive dans la file d'attente de messages. Des exemples de files d'attente de messages sont RabbitMQ et ZeroMQ .
  3. Configurez un équilibreur de charge et faites tourner plus de serveurs. Maintenant que vous utilisez efficacement le matériel et déléguez les tâches longues, vous pouvez évoluer horizontalement. Si vous disposez d'un équilibreur de charge, vous pouvez ajouter d'autres serveurs de bureau. À l'aide d'une file d'attente de messages, vous pouvez ajouter d'autres serveurs de travail. Vous pouvez même configurer cela dans le cloud afin de pouvoir évoluer à la demande.
88
Bart Verkoeijen

Cela dépend de la façon dont vous l'utilisez. Node.js est un thread unique par défaut, mais en utilisant le module de cluster (relativement) nouveau, vous pouvez évoluer horizontalement sur plusieurs threads.

De plus, les besoins de votre base de données détermineront également l'efficacité de la mise à l'échelle avec le nœud. Par exemple, l'utilisation de MySQL avec node.js ne vous apportera pas autant d'avantages que l'utilisation de MongoDB, en raison de la nature événementielle de MongoDB et de node.js.

Le lien suivant a beaucoup de benchmarks Nice de systèmes avec différentes configurations: http://www.techempower.com/benchmarks/

Node.js n'est pas le plus élevé mais comparé à d'autres configurations utilisant nginx (pas d'Apache sur leurs tables, mais assez proche), il s'en sort plutôt bien.

Encore une fois, cela dépend fortement de vos besoins. Je crois que si vous ne faites que servir des sites Web statiques, il est recommandé de vous en tenir à une pile plus traditionnelle. Cependant, les gens ont fait des choses incroyables avec node.js pour d'autres besoins: http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/ (c10k ? ha!)

Edit: Il convient de mentionner que vous ne remplacez pas vraiment Apache par node.js. Vous remplaceriez Apache ET php (dans une pile de lampes typique).

38
Kevin Lee