跳至主要內容
版本:4.x

Postgres 適配器

運作方式

Postgres 適配器依賴於 NOTIFYLISTEN 指令。

傳送至多個用戶端的每個封包(例如 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 版本支援
Socket 管理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兩次心跳之間的毫秒數5000
heartbeatTimeout在我們將節點視為已關閉之前,沒有心跳的毫秒數10000
cleanupInterval兩次清理查詢之間的毫秒數30000

常見問題

使用 Postgres 介面時,我是否仍需要啟用固定連線?

是。未執行此操作將導致 HTTP 400 回應 (您抵達的伺服器不知道 Socket.IO 連線)。

更多資訊可在此處找到 here

當 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 月連結

完整變更記錄

Emitter

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 月連結

完整變更記錄