Node.js est-il adapté au traitement en arrière-plan?

10

J'apprends lentement node.jset j'ai un petit projet que je veux démarrer. Le projet comportera de nombreux processus d'arrière-plan (téléchargement de données à partir de sites externes, analyse de fichiers CSV, etc.).

Un grand «gain» pour moi et le nœud est le fait qu'il utilise JavaScript pour le client et le serveur. Je code en Java et JavaScript dans mon travail de jour, mais je suis également très bon chez Ruby.

Mais, comme je l'ai dit, il semble intéressant d'utiliser une seule langue partout et JS semble correspondre à ce projet de loi.

Cependant, je n'ai pas beaucoup d'expérience dans l'utilisation de JS pour exécuter des tâches d'arrière-plan. Ruby semble exceller dans ce domaine. Et je ne suis pas opposé à l'utiliser. Alors, que pensez-vous de passer à 100% JS pour cela? Je me rends compte que les très grands projets nécessitent des solutions personnalisées. Je me demande simplement si cela en vaut la peine. Ou devrais-je rester avec Ruby sur ce genre de tâches?

Avis appréciés.

Merci

cbmeeks
la source
Vous pouvez également envisager vert.x comme une alternative à node.
Mike

Réponses:

13

Il est particulièrement efficace pour gérer une tonne d'E / S de fichiers et je m'attendrais à ce qu'il gère également une tonne de communications réseau. Il semble particulièrement populaire pour les applications pilotées par socket. La chose importante à garder à l'esprit est que si vos besoins ne sont pas satisfaits par les bibliothèques existantes (il y en a beaucoup), vous devrez peut-être plonger dans du C qui peut être lié aux commandes JS. Vous pouvez également générer des processus Node supplémentaires, mais je soupçonne que faire beaucoup de cela pourrait être taxé (je suppose - pourrait être faux - il y a une instance V8 générée pour chacun d'entre eux).

JS est monothread et bloquant, ce qui signifie que rien d'autre ne peut s'exécuter tant qu'un appel de fonction n'est pas terminé. C'était une fonctionnalité souhaitée de JS, éliminant essentiellement tous les problèmes de threading et de file d'attente. Le JS n'empêche pas les choses C / C ++ de s'exécuter de manière plus multi-thread sous le capot, donc le rôle de JS est vraiment plus architecture / messager. Si vous traitez l'image, vous ne voudrez pas gérer cela avec des commandes JavaScript synchrones, car tout le reste de votre application ou de votre serveur sera bloqué jusqu'à ce qu'il soit terminé. L'idée est que vous appelez une image à traiter par la fonctionnalité C / C ++ liée, puis répondez à l'événement «done» lorsque l'image est terminée en cours de traitement.

Cela nécessite que le JS dans n'importe quelle application Node.js soit fortement piloté par les événements et les rappels, ou il fonctionnera probablement très mal. Vous ne verrez donc pas beaucoup d'appels de méthode dans Node qui ne reçoivent pas de fonction pour une utilisation ultérieure. Une chose qui devient très claire très rapidement dans Node est que vous êtes dans un monde de laid si vous ne trouvez pas un moyen de gérer la pyramide de rappel. par exemple

//event CBs are more DOM-style than Node style and this isn't built-in Node file I/O
//keeping it simple and quick since I'll just get Node stuff wrong from memory
file.get('someFile.txt', function(e){
    e.fileObj.find('some snippet', function(e){
        someFinalCallBackHandler( e.snippetLocations );
    } );
} );

Heureusement, il existe de nombreux outils et exemples pour mieux gérer cela. La plupart ont tendance à tourner autour des mécanismes de promesse et à enchaîner simplement une série de fonctions destinées à répondre aux états de rappel les uns des autres dans un tableau qui fait le truc pyramidal laid pour vous sous le capot.

Personnellement, j'aime énormément que nous obtenions JS au niveau supérieur et C / C ++ plus proche du chrome. C'est le combo ultime et cela m'a inspiré pour commencer à apprendre le C. Et ne laissez pas le manque de potentiel de bibliothèque vous effrayer avant d'avoir fait des recherches. Les bibliothèques de nœuds sont produites à un rythme très rapide et arrivent à maturité très rapidement. Si vous ne faites rien de très inhabituel, les chances sont bonnes que quelqu'un le couvre.

La plus grande différence avec Rails, c'est que JS n'est jamais susceptible d'être sur rails pour ainsi dire. Nous avons tendance à coder pour pouvoir l'avoir comme vous le souhaitez très rapidement, donc il y a la corde pour vous accrocher avec le facteur et l'architecture a été assez bricolage en JS jusqu'à ces dernières années. J'appelle cela la liberté, mais je me rends compte que ce n'est pas considéré comme idéal pour beaucoup de développeurs.

De plus, vous n'aurez jamais de problème de "gemme" dans Node.js car vous avez essayé de l'installer sur autre chose qu'un Mac. Les développeurs Web côté client méprisent les problèmes de dépendance et c'est de là que vient le cœur de Node. Si cela ne fonctionne pas hors de la boîte en 5 minutes ou moins sur chaque plate-forme populaire, nous le froissons généralement et le jetons. Je n'ai pas encore rencontré de module populaire qui exigeait que je fasse quelque chose de spécial pour le faire fonctionner. Le système d'emballage est excellent.

Mais pour répondre à votre question principale de manière plus explicite / succincte: est-ce bon avec les processus d'arrière-plan?

Oui, Node est essentiellement un processus d'arrière-plan avec un moyen de piloter une application via des événements et des rappels.

Erik Reppen
la source
1
Il y a beaucoup d'informations générales ici, mais vous n'avez rien dit sur la capacité de node.js à gérer les demandes de manière asynchrone.
Robert Harvey
Bon point. Je mettrai un peu plus l'accent là-dessus.
Erik Reppen
En tant qu'ancien développeur Rails et développeur Node.js semi-expérimenté, je suis définitivement en désaccord avec la comparaison du système de package entre le monde Ruby / Rails et le monde JS / Node.js qu'Erik a fait. Tout développeur expérimenté (ou même non expérimenté) de Rails sait que les "gemmes" sont, littéralement, comme des gemmes. Ils travaillent sans effort. La plupart d'entre eux sont bien testés, robustes et stables. Cependant, plus de la moitié des modules NPM sont mal conçus, non testés et même pas terminés. Par exemple, personne ne peut me montrer les remplacements JS de Devise ou Paperclip avec exactement la même qualité et la richesse des fonctionnalités. En aucune façon.
scaryguy
Ce n'est pas mon expérience sur autre chose qu'un Mac. Cela dit, je suis moins impressionné par la compatibilité entre les systèmes d'exploitation de votre module de nœud typique que par le passé. Je ne sais pas si je viens de rencontrer plus de mauvais œufs avec de l'expérience ou si la communauté s'est développée pour inclure beaucoup de développeurs qui ne prennent pas la plate-forme aussi sérieusement qu'ils le devraient. Mais il y a certainement du snobisme Linux.
Erik Reppen
Cette réponse mérite tant de votes positifs
Amin Mohamed Ajani
2

Un problème à savoir est ce qui se produit lors du traitement de gros fichiers dans un environnement asynchrone : si votre flux d'entrée (un fichier) est plus rapide que votre flux de sortie (la base de données), vous ne pourrez pas gérer rapidement les événements de données d'entrée suffisant. Cela submergera une partie de votre système (flux de sortie ou mémoire) ou vous fera perdre des données. Pour cette raison, le traitement asynchrone des données peut être un peu délicat. Mais comme l'explique l'article auquel j'ai lié, la possibilité de suspendre le flux d'entrée permet de limiter la vitesse d'une manière qui convient à votre situation.


la source
1

Node.js excelle à IO. Il est très peu probable que vous découvriez un jour que votre processus est bloqué, car la plupart de vos threads bloquent les appels SQL.

Cependant node.js est vraiment mauvais au travail lié au calcul. Quand j'entends "beaucoup d'E / S", je pense "ouais! Allez nœud!", Mais quand j'entends "analyser", j'hésite un peu. Je ne suis pas sûr que ce soit pour une raison autre que les gens qui n'effectuent pas correctement le nœud multithreading, mais jusqu'à présent, tout le travail lié au calcul de mon produit se produit en dehors du nœud.

Le multithreading dans node.js est difficile à configurer correctement. Tout est monothread par défaut et la plupart du code est écrit en supposant qu'il ne fonctionnera que sous un thread. Vous devrez certainement utiliser des domaines pour éviter qu'une erreur sur un thread ne fasse tomber toute votre application.

Notez également que le nœud peut être un peu plus faible dans certaines capacités d'entreprise. Par exemple, ses bibliothèques de journalisation ne sont pas comparables à celles de Java. À l'heure actuelle, il n'y a pas de bon cadre de journalisation qui prend même en charge et MDC, ce qui signifie en pratique que vous pouvez en faire var logPrefix = userId + ": "beaucoup.

Je n'ai également jamais exécuté de dépôt privé npm, vous pourriez en avoir besoin selon que votre code est propriétaire.

Djechlin
la source
1

Si vos processus d'arrière-plan peuvent s'exécuter de manière séquentielle, cela peut être plutôt bon. À mon dernier poste, j'ai dû écrire un certain nombre de pré-processeurs, d'exportations et d'utilitaires de traduction pour de nombreuses sources de données. L'utilisation de NodeJS était un jeu d'enfant ici.

Si vous ne faites pas beaucoup de traitement lié au calcul, la manipulation simple de chaînes courtes et l'analyse syntaxique d'entier ne sont pas si mauvaises, si vous devez manipuler des images, ce n'est probablement pas le meilleur outil (bien qu'il existe des wrappers et des modules appelables cela peut bien fonctionner).

Conseil, respectez les modules qui utilisent des flux. Cela peut faciliter le transfert de votre traitement vers des modules pour cette étape particulière. Si vous regardez comment le flux d'événements est utilisé dans gulp-jade pour l'outil de construction de gulp par exemple, vous pouvez voir à quel point il est capable.

Pour CSV, vous pouvez utiliser node-csv , ce qui est assez bon pour établir une base de canalisation des enregistrements vers un flux de processeur.

Pour le XML de grande taille, où vous voulez faire un seul enregistrement à la fois, je regarderais node-halfstreamxml qui lit votre flux XML à l'aide d'un processeur SAX et déclenche des événements pour chaque nœud. Je voudrais envelopper cela dans un flux de lecture / écriture afin que vous puissiez augmenter vos correspondances souhaitées. De nombreux analyseurs d'objets xml dans le nœud tenteront de lire / analyser l'intégralité du xml à la fois, et par exemple 100 Mo de xml qui devient énorme ... où le halfstreamxml se lira comme un flux.

REMARQUE: il existe d'autres processeurs comme xml-stream qui utiliseront expat (bibliothèque C) en dessous, qui peuvent donner plus de performances, mais moins portable sans environnement de construction.

En général, ça a été une vraie joie d'utiliser ...

Tracker1
la source