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月 | リンク |