Postgres アダプター
仕組み
Postgres アダプターは、NOTIFY コマンドと LISTEN コマンドを利用します。
複数のクライアントに送信されるすべてのパケット (例: io.to("room1").emit()
や socket.broadcast.emit()
) は、
- 現在のサーバーに接続されている、一致するすべてのクライアントに送信されます。
- パケットにバイナリデータが含まれている場合、または 8000 バイトの制限を超える場合は、
- msgpack でエンコードされ、補助テーブルに挿入されます。
- 行 ID は NOTIFY コマンド内で送信されます。
- この行 ID は、クラスター内の他の Socket.IO サーバーによって受信され、テーブルをクエリし、パケットをデコードし、接続されているクライアントのセットにブロードキャストします。
- それ以外の場合、パケットは単に NOTIFY コマンド内で送信され、クラスター内の他の Socket.IO サーバーによって受信されます。


このアダプターのソースコードは、こちらで確認できます。
サポートされている機能
機能 | 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 |
tableName | 8000 バイトを超えるペイロードまたはバイナリデータを含むペイロード用のテーブルの名前 | socket_io_attachments |
payloadThreshold | ペイロードサイズのしきい値(バイト単位) | 8000 |
requestsTimeout | fetchSockets() や確認応答付きの serverSideEmit() など、サーバー間リクエストのタイムアウト | 5000 |
heartbeatInterval | 2 つのハートビートの間隔(ミリ秒単位) | 5000 |
heartbeatTimeout | ノードがダウンとみなされるまでのハートビートなしの時間(ミリ秒単位) | 10000 |
cleanupInterval | 2 つのクリーンアップクエリの間隔(ミリ秒単位) | 30000 |
よくある質問
Postgres アダプターを使用する場合でも、スティッキーセッションを有効にする必要がありますか?
はい。そうしないと、HTTP 400 レスポンスが発生します(Socket.IO セッションを認識していないサーバーにアクセスしているため)。
詳細については、こちらを参照してください。
Postgres サーバーがダウンした場合どうなりますか?
Postgres サーバーへの接続が切断された場合、パケットは現在のサーバーに接続されているクライアントにのみ送信されます。
最新リリース
バージョン | リリース日 | リリースノート | 差分 |
---|---|---|---|
0.3.1 | 2023年2月 | リンク | 0.3.0...0.3.1 |
0.3.0 | 2022年4月 | リンク | 0.2.0...0.3.0 |
0.2.0 | 2021年12月 | リンク | 0.1.1...0.2.0 |
0.1.1 | 2021年6月 | リンク | 0.1.0...0.1.1 |
0.1.0 | 2021年6月 | リンク |
エミッター
Postgres エミッターを使用すると、別の Node.js プロセスから接続されたクライアントにパケットを送信できます


インストール
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.0 | 2021年6月 | リンク |