2016-07-29 10 views
0

Momentan läuft mein nodejs/socket.io-Server in einem einzigen Thread, aber es gibt Möglichkeiten, ihn skalierbarer zu machen (here zum Beispiel), den ich in Zukunft übernehmen kann. Dies führt jedoch dazu, dass alle Instanzen des Servers auf verschiedenen Prozessen ausgeführt werden, die gruppiert sind. Auf diese Weise werden Ressourcen nicht mehr serialisiert und es entsteht ein Problem mit der Parallelität. Es gibt eine Möglichkeit, bestimmte Code-Segmente in verschiedenen Prozessen auf einem nodejs/socket.io Server basierend auf einem Schlüssel zu serialisieren? Zum Beispiel:Serialisieren einer Ressource in einer skalierten nodejs/socket.io-Anwendung

lock(key) 

/*make stuff*/ 

unlock(key) 

Dies ist ein Beispiel, aber es wird zu schätzen wissen, wenn ich die gleiche Aufgabe mit dem Versprechen erfüllen kann (ich weiß nicht, wie).

Antwort

1

Es gibt keinen vollständig generischen Cross-Prozess-Mutex, der alle anderen nodejs-Prozesse auf magische Weise unterbricht, während Sie etwas verarbeiten.

Es gibt jedoch viele verschiedene Arten von Werkzeugen, die zur Lösung eines bestimmten Problems verwendet werden können.

Das Werkzeug # 1 ist die Verwendung eines geeigneten Designs, um die Wettbewerbsbedingungen zwischen Ihren Prozessen zu minimieren oder zu eliminieren. Wie genau dies geschieht, hängt davon ab, welches Problem Sie lösen möchten. Daher können wir hilfreiche Informationen bereitstellen, wenn Sie das spezifische Problem beschreiben. Eine gängige Methode hierfür ist die Verwendung eines gemeinsamen Datenspeichers und das Entwerfen des Codes für die Verwendung atomarer Operationen in der Datenbank. Dies verwendet dann die Datenbankfunktionen selbst als Ihren Steuermechanismus (etwas, mit dem eine Datenbank für mehrere Benutzer typischerweise sehr gut umgehen kann).

Darüber hinaus können Sie Datenbanksperren, Dateisperren oder andere prozessübergreifende Kommunikationsmechanismen verwenden.

Hier ist eine Beschreibung der Verwendung redis: implement mutex in node.js

Hier ist ein Modul, das einen NodeJS Kreuz Prozess Mutex bietet (das Sperren von Dateien unter der Decke tatsächlich verwendet): https://github.com/Perennials/mutex-node

Und ein weiteres Modul: https://www.npmjs.com/package/rwlock

Jeder dieser Verriegelungsmechanismen könnte sicherlich in eine Promise-Schnittstelle eingebettet werden.