LoginSignup
0
2

More than 1 year has passed since last update.

複数ノードでsocket.ioを使用する

Posted at

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」時は同じサーバに接続する必要があります。

node_modules/engine.io/lib/server.js
    // ソース上の「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*"

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2