ALB配下に「socket.io」を使用しているインスタンスを複数立ち上げる際の対応
※シングルインスタンスで動作していることが前提となります。
シングルインスタンスのみ考慮されている状態の場合
unknown sid "xxx"
のようなエラーがレスポンスに戻ってきたりします。
「socket.io」は標準で複数インスタンスに対応していません。
※「socketio-sticky-session」を使用すればいけるかもしれませんが、私は試していません。
※「@socket.io/redis-adapter」はメッセージを共有することは出来るそうですが、「handshake」時の動作には対応していません
対応方法
AWSのALBなら「Stickiness」で、「socket.io」の「handshake」に対応が出来ます。
※詳しくは下記ページを参照
また、メッセージ部分は「@socket.io/redis-adapter」で対応が出来ます。
※redisのインストールが必要になります。
「unknown sid "xxx"」のメッセージ部分が出力される理由
下記のような形で情報を保持し、判定を行っています。
その為、「handshake」時は同じサーバに接続する必要があります。
// ソース上の「this.clients」を確認します
// レスポンスのエラー判定部分
const sid = req._query.sid;
if (sid) {
if (!this.clients.hasOwnProperty(sid)) {
debug('unknown sid "%s"', sid);
return fn(Server.errors.UNKNOWN_SID, {
sid
});
}
...
}
....
// 情報を保持している部分
this.clients[id] = socket;
this.clientsCount++;
socket.ioのログの確認方法
Chromeブラウザ(クライアント側)なら、DevToolsを開いてコンソールに下記を入力します。
コンソールログにデバッグ情報が表示されます。
localStorage.debug = '*';
nodejs(サーバ側)なら、下記を「環境変数」に設定します。
ログファイルにデバッグ情報が出力されます。
DEBUG="engine,socket.io*"