2016-08-16 14 views
0

node.jsを使用するマルチプレイヤーサーバーのセットは、ピーク時には1分に約1百万メッセージになります。ソケットを落とさずにサーバーを「正常に」再起動する方法はありますか?基本的には、再開を処理する最良の方法は、プレーヤーにとって通常非常に混乱させるだろうと思っていますか?ソケットを閉じずにリアルタイムのnode.jsサーバーを再起動しますか?

+1

私はあなたがpm2でそれを行うことはできないと思います。それは "ホットリロード"機能を持っていますが、あなたのサーバーが(Webソケットのような)長時間実行されているオープンな接続を保持していない場合にのみ機能します。 pm2のマニュアルでは、具体的に[こちら](http://pm2.keymetrics.io/docs/usage/cluster-mode/#statelessify-your-application)について言及しています。 – robertklep

答えて

1

プロセスが終了すると、OSはプロセスを終了すると、そのプロセスに属しているソケットをすべてクリーンアップします。したがって、単純なサーバーの再起動とソケット接続の維持はできません。

一部のオペレーティングシステムでは、ソケットの所有権をあるプロセスから別のプロセスに渡すことができるため、一時的なプロセスまたは既存の親プロセスを作成することは技術的に実現可能です)、ソケットの所有権を他のプロセスでは、サーバーを再起動し、所有権を新しく開始したプロセスに戻します。私はこれを試したことがない(またはそれについて聞いたことがある)が、実現可能なもののように聞こえる。

ここでは、node.jsにchild.send()を使用して子プロセスにソケットを転送する場合のsome informationです。これは、netモジュールで作成されたnode.jsソケットに対してのみ行うことができ、それを行うことに関するいくつかの注意点がありますが、可能です。

そうでない場合、通常の回避策では、接続が閉じられるとクライアントが自動的に再接続します。正常に完了しました。これは、クライアントにかなり透過的になります(ただし、サーバーが実行されていない瞬間を除く)。

1

接続を保存するためにredisまたは一部のインメモリデータベースを使用して、セッションや接続を失うことなくサーバーを再起動しても簡単に再接続できるようにします。それがあなたの必要性に合っているなら、これを試してください。また、再接続中に注意してください接続が低下する可能性がありますので、あなたは非常に簡単に再び接続されます。 socket.io-redis

関連する問題