228 votes

Node.js et demandes intensives de CPU

J'ai commencé à bricoler avec Node.js serveur HTTP et j'aime beaucoup écrire Javascript côté serveur, mais quelque chose me garde de commencer à utiliser des Node.js pour mon application web.

Je comprends l'ensemble des e/S asynchrone concept mais je suis un peu préoccupé par les cas où le code de procédure est très consommateur d'UC telles que la manipulation de l'image ou de tri de grands ensembles de données.

Si je comprends bien, le serveur va être très rapide pour la simple page web demandes, telles que l'affichage d'une liste d'utilisateurs ou de l'affichage d'un post de blog. Cependant, si je veux écrire beaucoup de temps CPU de code (dans l'admin de back-end par exemple) qui génère des graphiques ou redimensionne des milliers d'images, la demande sera très lente (quelques secondes). Étant donné que ce code n'est pas asynchrone, toutes les requêtes arrivant sur le serveur pendant ces quelques secondes sera bloqué jusqu'à ce que ma demande lente est fait.

Une suggestion a été d'utiliser des Web workers pour les tâches gourmandes en CPU. Cependant, j'ai peur des web workers sera difficile à écrire du code propre, car il fonctionne par dont un séparé fichier JS. Que faire si le CPU intensive code est situé dans une méthode de l'objet? Il craint d'écrire un fichier JS pour chaque méthode qui est consommateur d'UC.

Une autre suggestion consistait à lancer un processus enfant, mais qui rend le code même de moins en moins gérables.

Toutes les suggestions pour surmonter cette (supposée) de l'obstacle? Comment écrivez-vous nettoyer le code orienté objet avec Node.js tout en veillant à ce CPU lourdes tâches sont exécutées asynchrone?

300voto

mbq Points 8963

C'est l'incompréhension de la définition de serveur web -- il ne doit être utilisé pour "parler" avec les clients. Lourde charge les tâches devraient être déléguées à des programmes autonomes (que, bien sûr, peut également être écrit en JS).
Vous auriez probablement dire que c'est sale, mais je vous assure qu'un processus du serveur web coincé dans le redimensionnement des images est juste le pire (même pour permet de dire à Apache, quand il ne bloque pas les autres requêtes). Encore, vous pouvez utiliser une bibliothèque commune pour éviter la redondance.

EDIT: je viens avec une analogie; application web doit être aussi un restaurant. Vous disposez de serveurs (serveur web) et les cuisiniers (les travailleurs). Les serveurs sont en contact avec les clients et effectuer des tâches simples comme la fourniture de menu ou d'expliquer si certains plat végétarien. D'autre part, ils délèguent des tâches plus compliquées à la cuisine. Parce que les serveurs sont à ne faire que des choses simples, ils répondent rapidement, et les cuisiniers peuvent se concentrer sur leur travail.

Node.js ici, serait un simple mais très talentueux garçon qui peut traiter de nombreuses demandes à la fois, et Apache serait un gang de dumb serveurs que de simplement traiter une demande de chacun. Si celui-ci Node.js garçon serait de commencer à cuisiner, il serait immédiatement une catastrophe. Encore, la cuisine pourrait également l'échappement de même une grande quantité de serveurs Apache, de ne pas mentionner le chaos dans la cuisine et la diminution progressive de responsitivity.

60voto

Tim Points 574

Ce que vous avez besoin est une tâche de la file d'attente! Le déplacement de vos tâches longues, de du serveur web est une BONNE chose. Veiller à ce que chaque tâche dans "séparé" fichier js favorise la modularité et la réutilisation du code. Il vous oblige à réfléchir à la structure de votre programme de façon à le rendre plus facile à déboguer et à maintenir dans le long terme. Un autre avantage d'une tâche de la file d'attente est que les travailleurs ne puissent être écrites dans une langue différente. Just pop d'une tâche, faire le travail, et d'écrire la réponse en retour.

quelque chose comme ceci https://github.com/resque/resque

Voici un article à partir de github sur le pourquoi ils ont construit http://github.com/blog/542-introducing-resque

7voto

Toby Hede Points 22128

Couple des approches que vous pouvez utiliser.

@Tim notes, vous pouvez créer une tâche asynchrone qui se trouve à l'extérieur ou en parallèle à votre principale servant de la logique. Dépend de vos besoins exacts, mais même cron peut agir comme un mécanisme de mise en queue.

Les web workers peut travailler pour votre async les processus, mais ils ne sont actuellement pas pris en charge par node.js. Il y a quelques extensions qui offrent un soutien, par exemple: http://github.com/cramforce/node-worker

Vous obtenez toujours vous pouvez toujours réutiliser les modules et le code au travers de la norme "exige" le mécanisme. Vous avez juste besoin de s'assurer que la première expédition pour le travailleur transmet toutes les informations nécessaires pour traiter les résultats.

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