Griff lang andauernde Prozesse in NodeJS?
Ich habe gesehen, einige ältere Beiträge berühren das Thema, aber ich wollte wissen, was die heutigen, modernen Ansatz.
Der Anwendungsfall ist: (1) angenommen, Sie wollen eine lange laufende Aufgabe auf eine video-Datei, sagen wir 60 Sekunden lang, sagen jspm install
können bis zu 60 Sekunden dauern. (2) man kann NICHT unterteilen Sie die Aufgabe.
Weitere Anforderungen sind:
- müssen wissen, Wann eine Aufgabe beendet
- schön, in der Lage zu stoppen, eine laufende Aufgabe
- Stabilität: wenn eine Aufgabe stirbt, es nicht bringen Sie nach unten die server
- muss in der Lage sein zu handhaben 100s von gleichzeitigen Anfragen
Ich gesehen habe, diese Lösungen erwähnt:
- nodejs Kind-Prozess
- Webworker
Fasern- nicht für CPU-gebundene AufgabenGeneratoren- nicht für CPU-gebundene Aufgaben- https://adambom.github.io/parallel.js/
- https://github.com/xk/node-threads-a-gogo
- jeder andere?
Ist die moderne, standard-basierte Ansatz? Auch, wenn nodejs ist nicht geeignet für diese Art von Aufgabe ist, dann ist das auch eine gültige Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die kurze Antwort ist: Je
Wenn du meinst nodejs server, dann ist die Antwort: Nein für diesen Anwendungsfall. Nodejs ist single-thread-Fall nicht umgehen kann, CPU-gebundene Aufgaben, also macht es Sinn sich für die Auslagerung der Arbeit an einen anderen Prozess oder thread. Jedoch, für diesen Anwendungsfall, in dem die CPU-gebundene Aufgaben ausgeführt werden, für eine lange Zeit, macht es Sinn, einen Weg finden, der queueing-Aufgaben... also, macht es Sinn, eine worker-Warteschlange.
Jedoch, für diesen besonderen Anwendungsfall der Ausführung JS-code (
jspm API
), macht es Sinn, eine worker-Warteschlange verwendet nodejs. Also, die Lösung ist: (1) verwenden Sie einen nodejs-server, die nichts tut, aber Warteschlange-Aufgaben in die worker-Warteschlange. (2) mit einem nodejs-worker-Warteschlange (wiekue
), um die tatsächliche Arbeit. Verwendencluster
verteilen der Arbeit auf verschiedene CPUs. Das Ergebnis ist eine einfache, single server verarbeiten kann Hunderte von Anfragen (w/o Würgen). (Naja, fast, siehe die Anmerkung unten...)Hinweis:
kue
ist dies trivial---so stellen Sie jeden Punkt, der server auf der gleichen db).Sind Sie erwähnen eine CPU-gebundene Aufgabe und ein langer man, das ist definitiv nicht ein node.js Sache. Sie erwähnen auch Hunderte von gleichzeitigen Aufgaben.
Könnten Sie werfen Sie einen Blick auf so etwas wie Gearman-job-server für Dinge wie, dass es eine spezielle Lösung.
Alternativ können Sie auch noch haben Node.js verwalten der Anfragen, nur nicht die eigentliche Ausführung des Jobs.
Wenn es relativ akzeptabel, die unteren haben dann eine optimale Leistung, und Sie möchten, dass Ihr code in JavaScript, können Sie es immer noch tun, aber Sie sollten haben eine Art von job-Warteschlange - so etwas wie Redis oder RabbitMQ in den Sinn kommt.
Ich denke, der job queue wird eine muss-Voraussetzung für lang andauernde, Hunderte/sec-Aufgaben, unabhängig von Ihrer Laufzeit. Außer wenn Sie laichen können diesem Auftrag auf anderen Servern/services/Maschinen - dann brauchen Sie sich nicht kümmern, Ihre Node.js API ist nur eine Vorder-und management-layer für die job-cluster, dann Node.js ist vollkommen ok für den job, und Sie brauchen, um konzentrieren sich auf, die job-cluster, und Sie könnten dann stellen Sie eine bessere Frage.
Nun
node.js
können immer noch nützlich sein für Sie hier, es kann helfen, zu verwalten und halten Sie die, die Sie Hunderte von Aufgaben, je nachdem, wo Sie herkommen (ie. Sie könnte nur das zulassen von requests durch zu gehen, um Ihre job-server für bestimmte Benutzer, oder begrenzen Sie die "pause" - Funktionalität zu anderen etc.