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?
Antwort
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).
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
- 1. Schließen eines abhörenden TCP-Sockets in C
- 2. Vergessen zum Schließen eines Server Sockets
- 3. RAII-Sockets: Wann freigeben (schließen)
- 4. Hibernate/Neustart eines Threads
- 5. Scanner schließen, ohne System.in zu schließen
- 6. Fenster schließen ohne zu schließen Anwendung
- 7. Neustart eines setInterval() in Javascript/jQuery (ohne clearInterval)
- 8. Generieren von Vielfachen eines Berichts, ohne einen davon zu schließen
- 9. Schließen eines tkinter Eintrags-Widgets, ohne das Programm zu beenden
- 10. Neustart eines Wordpress-Projekts
- 11. Anwendung zu schließen, ohne Fehlermeldungen
- 12. Sollte ich Sockets von beiden Enden schließen?
- 13. Erstellen eines aktualisierbaren tkinter-Fensters ohne Schließen
- 14. C Sockets schließen Verbindung, wenn keine Antwort
- 15. Interprozess-Dateisystem Kommunikation ohne Sockets
- 16. Zu langsam Sellerie Neustart
- 17. Echtzeit-Audioverarbeitung ohne Ausgabe
- 18. Erstellen eines Sockets C++
- 19. android- Neustart-Anwendung auf Kraft schließen
- 20. Asio-Socket zerstören, ohne nativen Handler zu schließen
- 21. Microsoft Band erhalten Daten Echtzeit ohne die Verwendung eines mobilen
- 22. Neustart eines TCP-Servers
- 23. Reload eines .sql-Schemas ohne Neustart von mysqld
- 24. Erstellen eines Echtzeit-Preisberechnungsformulars
- 25. Neustart eines Windows-Dienstes
- 26. Schließen Sie JFrame, ohne mein gesamtes Projekt zu schließen
- 27. Neustart eines Python-Interpreters ruhig
- 28. Echtzeit weiche Schatten ohne Stencilbuffer
- 29. Einen JFrame schließen, ohne einen anderen zu schließen?
- 30. Installiere Jenkins Plugin ohne Neustart
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