質問: socket) ? false : true; }); console.log("close"); }); }); ``` クライアントがサーバーに接続してきたソケットを保存し、切断時にそれを破棄していますが、 `pm2 restart appname`を実行時には以下のどのような挙動になるでしょうか。 1. 全てのクライアントがサーバーから切断しない限りは古いプロセスは終了しない 2. コールバックが全て処理された時点で再読み込みされる 3. その他 挙動が2の場合、`socketList`にまだ要素が残っている時に再読み込みされた場合には 新しいプロセスで同じ変数に情報は引き継がれるのでしょうか。 ご教授お願いいたします。
回答: Node.jsはWebSocketのパイオニア的な存在なので、 凄まじいパフォーマンスを出しそうに見えますが、 コヤツは実は1台のマシンで1万の同時接続を捌けません。 1サーバに同時接続出来る人数を5000人とかに絞って、 縦割りで実装すれば今回の質問のような所まで問題を持っていけると思います。 ですが、そもそも別方向で考えれば質問文の疑問も一発解決出来る妙案があります。 フロントで動くWebSocketのAサーバはロジック部分を持たず、 ユーザとの通信のみに集中します。 つまり、本質問で懸念しているロジックを更新するためにプロセスを落としたら接続どうするねん問題から逃げます。 そしてサーバーサイドにもう一台、WebサーバもしくはWebSocketサーバを立ち上げます。 これをBサーバと名付けます。 Bサーバはロジック部分を受け持ちます。 ゲームの進行状況、対戦者の情報、スコア...といった状態も持たせておきます。 Aサーバからの接続を待ち受けて、リクエスト通りにゲームを進行させ、結果をAサーバに返します。 AサーバはBサーバにお伺いを建てながらプレイヤー達に結果を返します。 つまり、Bサーバはフロントからアクセス出来ないようにしつつ、1台サーバを噛ませる事でフロントからの接続を切らせずにバックエンドを更新する事が可能になるでしょう。 この場合、ゲームのアップデートの為にBサーバを落とすとなると、 プレイ中のデータが全て消えてしまいます。 なので極力Bサーバの変数領域やメモリ空間等にゲームのデータを持たせてはいけません。 RedisやMySQL等のデータベースに持たせるような作りにしましょう。 後はAサーバ→Bサーバへお伺いを立てるリクエストが失敗したら、 再度通信するような仕組みを作っておけばBサーバは更新し放題になるでしょう。