メインコンテンツへスキップ
バージョン: 4.x

Postgres アダプター

仕組み

Postgres アダプターは、NOTIFY コマンドと LISTEN コマンドを利用します。

複数のクライアントに送信されるすべてのパケット (例: io.to("room1").emit()socket.broadcast.emit()) は、

  • 現在のサーバーに接続されている、一致するすべてのクライアントに送信されます。
  • パケットにバイナリデータが含まれている場合、または 8000 バイトの制限を超える場合は、
    • msgpack でエンコードされ、補助テーブルに挿入されます。
    • 行 ID は NOTIFY コマンド内で送信されます。
    • この行 ID は、クラスター内の他の Socket.IO サーバーによって受信され、テーブルをクエリし、パケットをデコードし、接続されているクライアントのセットにブロードキャストします。
  • それ以外の場合、パケットは単に NOTIFY コマンド内で送信され、クラスター内の他の Socket.IO サーバーによって受信されます。
Diagram of how the Postgres adapter worksDiagram of how the Postgres adapter works

このアダプターのソースコードは、こちらで確認できます。

サポートされている機能

機能socket.io バージョンサポート
ソケット管理4.0.0✅ はい (バージョン 0.1.0 以降)
サーバー間通信4.1.0✅ はい (バージョン 0.1.0 以降)
確認応答付きブロードキャスト4.5.0✅ はい (バージョン 0.3.0 以降)
接続状態の復元4.6.0❌ いいえ

インストール

npm install @socket.io/postgres-adapter pg

TypeScript ユーザーの場合は、@types/pg も必要になる場合があります。

使用方法

import { Server } from "socket.io";
import { createAdapter } from "@socket.io/postgres-adapter";
import pg from "pg";

const io = new Server();

const pool = new pg.Pool({
user: "postgres",
host: "localhost",
database: "postgres",
password: "changeit",
port: 5432,
});

pool.query(`
CREATE TABLE IF NOT EXISTS socket_io_attachments (
id bigserial UNIQUE,
created_at timestamptz DEFAULT NOW(),
payload bytea
);
`);

pool.on("error", (err) => {
console.error("Postgres error", err);
});

io.adapter(createAdapter(pool));
io.listen(3000);

オプション

名前説明デフォルト値
uidこのノードの IDランダム ID
channelPrefix通知チャネルのプレフィックスsocket.io
tableName8000 バイトを超えるペイロードまたはバイナリデータを含むペイロード用のテーブルの名前socket_io_attachments
payloadThresholdペイロードサイズのしきい値(バイト単位)8000
requestsTimeoutfetchSockets() や確認応答付きの serverSideEmit() など、サーバー間リクエストのタイムアウト5000
heartbeatInterval2 つのハートビートの間隔(ミリ秒単位)5000
heartbeatTimeoutノードがダウンとみなされるまでのハートビートなしの時間(ミリ秒単位)10000
cleanupInterval2 つのクリーンアップクエリの間隔(ミリ秒単位)30000

よくある質問

Postgres アダプターを使用する場合でも、スティッキーセッションを有効にする必要がありますか?

はい。そうしないと、HTTP 400 レスポンスが発生します(Socket.IO セッションを認識していないサーバーにアクセスしているため)。

詳細については、こちらを参照してください。

Postgres サーバーがダウンした場合どうなりますか?

Postgres サーバーへの接続が切断された場合、パケットは現在のサーバーに接続されているクライアントにのみ送信されます。

最新リリース

バージョンリリース日リリースノート差分
0.3.12023年2月リンク0.3.0...0.3.1
0.3.02022年4月リンク0.2.0...0.3.0
0.2.02021年12月リンク0.1.1...0.2.0
0.1.12021年6月リンク0.1.0...0.1.1
0.1.02021年6月リンク

完全な変更履歴

エミッター

Postgres エミッターを使用すると、別の Node.js プロセスから接続されたクライアントにパケットを送信できます

Diagram of how the Postgres emitter worksDiagram of how the Postgres emitter works

インストール

npm install @socket.io/postgres-emitter pg

使用方法

const { Emitter } = require("@socket.io/postgres-emitter");
const { Pool } = require("pg");

const pool = new Pool({
user: "postgres",
host: "localhost",
database: "postgres",
password: "changeit",
port: 5432,
});

const emitter = new Emitter(pool);

setInterval(() => {
emitter.emit("ping", new Date());
}, 1000);

チートシートについては、こちらを参照してください。

最新リリース

バージョンリリース日リリースノート差分
0.1.02021年6月リンク

完全な変更履歴