オンライン対戦ゲームのサーバープログラムをNode.jsで作成しています。
※WebSocketを使用した、1対1の将棋のようなターン制のゲーム
※オンライン接続時にルーム作成。空きルームが存在すればそこに参加。複数のルームでそれぞれ対戦が行われるイメージ。
後々追加したい機能があるため、サーバープログラムもその都度更新する予定です。
その際に、現在対戦中のプレイヤーの処理を中断せずに更新をしたいと考えています。
(もちろん、大幅な修正がある場合は別ですが)
調べたところ、Node.jsはホットデプロイ機能がないためグレースフルリスタートで対応するのが良いとわかりました。
PM2のgracefulReloadを使用すればそのような処理が可能になるのでしょうか。
[参考サイト]
https://qiita.com/ikemura23/items/b3481393d4edca2d5188
https://blog.morugu.com/entry/2018/01/30/222200
npm install -g pm2 pm2 start xxx.js --name appname pm2 restart appname
また、上記参考サイトに
引用テキスト「pm2 restart:稼働中のプロセスを正常に(処理が終了してから)終了して再読込する.」
とありましたが、例えばサーバープログラムが以下の場合
var ws = require ('ws').Server; var wss = new ws ({port: (process.env.PORT||3000)}); var socketList = []; wss.on ('connection', function (socket) { socketList.push(socket); socket.on ('message', function (message) { console.log(message); // 実際にはここでマッチング処理や対戦中の処理を行う。 }); socket.on('close', function () { socketList= socketList.filter(function (conn, i) { return (conn === socket) ? false : true; }); console.log("close"); }); });
クライアントがサーバーに接続してきたソケットを保存し、切断時にそれを破棄していますが、
pm2 restart appname
を実行時には以下のどのような挙動になるでしょうか。
- 全てのクライアントがサーバーから切断しない限りは古いプロセスは終了しない
- コールバックが全て処理された時点で再読み込みされる
- その他
挙動が2の場合、socketList
にまだ要素が残っている時に再読み込みされた場合には
新しいプロセスで同じ変数に情報は引き継がれるのでしょうか。
ご教授お願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/04 09:21
2019/03/04 09:56 編集
2019/03/04 10:40