2016-08-21 1 views
0

Je travaille sur un projet IOT où l'application Node.js effectuer des tâches suivantes:

1. flux de lecture des messages à l'aide de la bibliothèque de messagerie asynchrone (lié IO)
2. Envoi des messages au service Web où l'apprentissage de la machine se produit sur la base des messages qui ont été envoyés par l'application Node.js (IO lié comme seul appel API est impliqué)
3. Recevoir le modèle généré à la suite de l'apprentissage automatique à partir du service Web (à l'aide de l'API REST) ​​ 4. Comparer le pattern contre les messages de streaming en temps réel (CPU intensive en tant qu'algorithmes complexes sont impliqués pour la correspondance de modèle).
5. Consignation des traces de pile (IO bound)Comment appliquer des techniques de processus enfants de clustering/spawing pour l'application Node.js ayant des tâches liées à IO bouth et à des CPU?

Une application node.js va être développée pour que ces fonctionnalités soient des tâches séparées s'exécutant sous un seul thread par défaut. Étant donné que le processus enfant ne sera utile que pour les tâches intensives du processeur, comment faire pour le clustering pour node.js? Avons-nous besoin d'effectuer partiellement le clustering sur cette application node.js?

Quelqu'un peut-il s'il vous plaît suggérer l'architecture efficace pour cette application node.js?

Répondre

1

Si vous avez des Tâches gourmandes en ressources, utilisez le clustering pour toutes les demandes. Le fait qu'un processus en cluster effectue également des tâches intensives en E/S ne vous fera pas de mal, mais vous aurez besoin du processus en cluster pour les tâches gourmandes en ressources processeur. Donc, faites en sorte que votre serveur soit en cluster et laissez chaque cluster gérer la charge complète d'une requête (à la fois les E/S et le CPU).

En un mot, les tâches gourmandes en ressources CPU sont le principal facteur de clustering. Cela ne nuit à rien si les processus en cluster effectuent également des E/S non bloquantes. En fait, la mise en cluster jusqu'au nombre de processeurs disponibles peut même aider les processus liés aux E/S dans des situations de charge élevée (mais pas autant qu'avec les processus gourmands en ressources).


Une alternative, mais il peut être une mise en œuvre plus complexe, consiste à utiliser des processus enfants que pour les parties CPU à forte intensité de votre traitement de la demande. Dans ce cas, vous créeriez une sorte de file d'attente de travail et un ensemble de processus enfants pour effectuer des opérations dans la file d'attente et votre processus maître distribuerait des tâches à chaque processus enfant de la file d'attente. En utilisant ce schéma, vous pouvez décider exactement quel code est exécuté via la file d'attente de travail et quel code reste dans le processus principal, bien que vous deviez maintenant coordonner entre les deux en utilisant une sorte de communication interprocessus.