2016-07-18 6 views
0

So habe ich diesen API-Endpunkt namens www.example.com/endpoint auf dem viele Geräte veröffentlichen (ich arbeite in einem IOT-Unternehmen). Wir haben unsere gesamte Unterstützung in NodeJS implementiert und stecken fest, während wir von 1 Gerät auf 'n' Geräte skalieren. Die Geräte posten ihre Pakete an diesem API-Endpunkt, von wo aus ich ein komplexes Code-Bit (arnd 1000 Zeilen) ausfühle und den Zustand des Gerätes in der Datenbank (mongoDB) speichere. Jetzt ist das Problem. Immer wenn ich ein Paket von Gerät 1 erhalte und ich führe es aus und in der Mitte bekomme ich ein Paket von Gerät 2, NodeJS belässt das Gerät 1 so wie es ist und beginnt das Paket 2 von Gerät 2 zu bedienen, das habe ich gesehen, als ich es gestellt habe umfangreiche console.log() -Anweisungen
Jetzt in einer idealen Welt. Ich möchte, dass Knoten den Kontext meines aktuellen Fortschritts mit Paket 1 speichert. und weitermachen, um das Paket 2 in einer Warteschlange zu speichern, um später verarbeitet zu werden. Sobald ich mit Paket 1 fertig bin, nehme ich Paket 2 entgegen und bearbeite es.
Ich kenne Bibliotheken wie RabbitMQ und kue für das Speichern in der Warteschlange und die Verarbeitung später, aber wie wechsel ich Kontext von einer Ausführung zu einer anderen?
Das ist meine Art zu denken. Es könnte auch andere Lösungen geben. Möchte deine Gedanken dazu hören.So implementieren Sie Parallelität oder Kontextwechsel in NodeJS

+0

Was bewirkt dieses komplexe Bit des Codes? Ist es rein rechnerisch oder beinhaltet es (viele) I/O, wie Datenbank/Datei/Netzwerkinteraktion? Der Knoten kann ziemlich viel gleichzeitige E/A verarbeiten. – robertklep

+0

Es beinhaltet viele Rückrufe ... –

+0

Angenommen, dass das bedeutet "viele I/O", denke ich, dass etwas anderes Ihre Probleme verursachen kann. – robertklep

Antwort

1

F:Wie Integritätskonvergenz oder Kontextwechsel in NodeJS implementieren.

A: Kurze Antwort: Nicht möglich. Weil Javascript single threaded ist.


Q:Jetzt ist das Problem. Immer wenn ich ein Paket von Gerät 1 erhalte und ich führe es aus und in der Mitte bekomme ich ein Paket von Gerät 2, NodeJS belässt das Gerät 1 so wie es ist und beginnt das Paket 2 von Gerät 2 zu bedienen, das habe ich gesehen, als ich es gestellt habe umfangreiche console.log() Aussagen

A: Wie Sie bereits in zahlreichen Orten gelesen haben könnten, die NodeJS auf einem ereignisgesteuerten Modell basiert, das ist nicht blockierende für I/O.

Der Grund, warum Knoten device1 Mitte ditched zu haben scheint zu dienen device2 war, da der Code für device1 wurde bis zu einem Punkt bereits verarbeitet, wo es nur darauf warten, auf einem asynchronous function Rückruf an. Z.B. Durchführen eines Datenbankschreibens. So während es verfügbar ist, ging es weiter zu Service device2

Ähnliche Fall für device2 - sobald es eine async Funktion trifft, wo ein Ereignis in die Ereigniswarteschlange geschoben wird, ausstehende für eine Rückkehr. Node geht möglicherweise zurück zu device1, wenn eine Antwort zurückkommt. Oder es könnten andere Geräte sein, deviceN.

Wir sagen NodeJS ist nicht blockierend, weil der node Prozess nicht die gesamte Webanwendung für eine einzige Antwort nach unten gesperrt. Stattdessen geht es weiter und wählt das nächste Ereignis (im Wesentlichen einen Codeblock) aus der Warteschlange aus, um es auszuführen. Daher ist es ständig beschäftigt, es sei denn, in der Ereigniswarteschlange ist wirklich nichts verfügbar.


F: Ich weiß, Bibliotheken wie RabbitMQ und kue für sie in der Warteschlange speichern und später die Verarbeitung, aber wie schalte ich Zusammenhang von einer Ausführung zur anderen?

A: Wie schon gesagt. ab 2016 - Javascript ist noch immer nicht möglich, Threading durchzuführen. NodeJS ist nicht entworfen für schwere Rechenarbeit, sollte es nur auf die Bedienung Anfragen gerichtet werden, daher sollte der Code vorzugsweise hell und nicht blockierend sein. Im Grunde werden Sie diese schweren I/O-Aufgaben gerne in Dateien oder Datenbanken schreiben oder HTTP-Anforderungen (Netzwerk) an andere Prozesse stellen, indem Sie die Aufrufe mit asynchronen Funktionen umhüllen.

NodeJS ist keine Silver Bullet Technologie. Wenn von Ihrer Anwendung erwartet wird, dass sie viel Rechenarbeit an dem Ereignisthread leistet, dann ist Node wahrscheinlich keine gute Wahl der Technologie, aber es ist nicht das Ende der Welt - da Sie Ihren eigenen Kindprozess für die schweren Rechenaufgaben aufstellen können.

See: https://nodejs.org/api/child_process.html

Sie auch Alternative betrachten wie Java möchten vielleicht die NIO und Threading Fähigkeiten hat.