2016-08-16 5 views
0

Wir haben eine kleine Gruppe von Multiplayer-Servern unter Verwendung von node.js, die derzeit etwa 1 Million Nachrichten pro Minute während der Hauptnutzung liefern. Gibt es eine Möglichkeit, den Server "anmutig" neu zu starten, ohne Sockets zu löschen? Im Grunde frage ich mich, wie man am besten mit Neustarts umgehen kann, wenn dies für die Spieler normalerweise sehr störend wäre.Neustart eines Node.js-Servers in Echtzeit ohne Sockets zu schließen?

+1

Ich glaube nicht, dass Sie es mit PM2 tun können. Es hat zwar eine "Hot Reload" -Funktion, aber das funktioniert nur, wenn Ihr Server keine lang laufenden offenen Verbindungen (wie (Web-) Sockets) aufrecht erhält. Das pm2-Handbuch erwähnt dies ausdrücklich [hier] (http://pm2.keymmetrics.io/docs/usage/cluster-mode/#statelessify-your-application). – robertklep

Antwort

1

Wenn ein Prozess beendet wird, bereinigt das Betriebssystem alle Sockets, die zu ihm gehören, indem er sie schließt. Es gibt also keine Möglichkeit, einfach einen Neustart des Servers durchzuführen und Ihre Socket-Verbindungen zu erhalten.

In einigen Betriebssystemen können Sie den Besitz eines Sockets von einem Prozess zu einem anderen übertragen, so dass es technisch möglich ist, einen temporären Prozess oder einen zuvor vorhandenen übergeordneten Prozess zu erstellen) anderen Prozess, starten Sie den Server neu und übertragen Sie das Eigentum zurück auf den neu gestarteten Prozess. Ich habe das nie versucht (oder davon gehört), aber es klingt nach etwas, das machbar wäre.

Hier ist some information beim Übertragen eines Sockets an einen untergeordneten Prozess mit child.send() in node.js. Es scheint, dass dies nur für einen node.js-Socket, der vom net-Modul erstellt wurde, gemacht werden kann, und es gibt einige Vorbehalte, dies zu tun, aber es ist möglich.

Wenn nicht, ist die übliche Umgehung die Clients automatisch wieder verbinden, wenn ihre Verbindung geschlossen ist. Richtig ausgeführt, kann dies für den Client ziemlich transparent sein (außer für die momentane Zeit, wenn der Server nicht läuft).

1

Verwenden Sie redis oder eine In-Memory-Datenbank zum Speichern der Verbindung, damit Sie die Verbindung auch nach dem Neustart des Servers wiederherstellen können, ohne Sitzungen oder Verbindungen zu verlieren. Versuchen Sie es, wenn es Ihren Bedürfnissen entspricht. Bitte beachten Sie auch, dass während des Neustarts die Verbindung möglicherweise unterbrochen wird, aber aufgrund der Persistenz sind Sie sehr leicht wieder verbunden. socket.io-redis

Verwandte Themen