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
Antwort
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.
- 1. Wie Multithreading, Parallelität oder Parallelität in iOS Swift tun?
- 2. So implementieren Sie IAsyncOperationWithProgress
- 3. iOS4 - schnelle Kontextwechsel
- 4. Was ist ein Kontextwechsel?
- 5. So implementieren Sie das Ereignis
- 6. So implementieren Sie HTTP-Tunneling
- 7. So implementieren Sie einen Einheitenumrechner in Java
- 8. So implementieren Sie threadsichere Warteschlangen
- 9. So implementieren Sie variable Argumente in F #
- 10. So implementieren Sie zusammengesetzte Schlüssel in Neo4J
- 11. So ersetzen Sie alle '\' zu '/' in Nodejs
- 12. So erstellen Sie Threads in nodejs
- 13. So implementieren Sie Singleton in Shell-Skript
- 14. So implementieren Sie Seite Curl in MuPDF
- 15. gcc Inline-Assembly für Kontextwechsel
- 16. So implementieren Sie eine Navigationsleiste in angularjs
- 17. So implementieren Sie die Authentifizierung in WebService
- 18. So implementieren Sie ACL in Postgresql
- 19. So implementieren Sie GMUClusterRenderer in Swift
- 20. So implementieren Sie "Live" -Filterung in Silverlight
- 21. So implementieren Sie temporäre Daten in MySQL
- 22. So implementieren Sie Video DRM in iOS
- 23. So implementieren Sie if-else
- 24. So implementieren Sie Braintree Escrow
- 25. DDD - So implementieren Sie Fabriken
- 26. So implementieren Sie Excel ACCRINT
- 27. So implementieren Sie SAML SSO
- 28. So implementieren Sie einen Aktionsfilter in NopCommerce
- 29. Konnte Kontextwechsel Stapelüberlauf verursachen?
- 30. So implementieren Sie onActivityResult in RecyclerView Fragment
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
Es beinhaltet viele Rückrufe ... –
Angenommen, dass das bedeutet "viele I/O", denke ich, dass etwas anderes Ihre Probleme verursachen kann. – robertklep