Postgres 适配器
工作原理
Postgres 适配器依赖于 NOTIFY 和 LISTEN 命令。
发送到多个客户端的每个数据包(例如 io.to("room1").emit()
或 socket.broadcast.emit()
)都会
- 发送到连接到当前服务器的所有匹配客户端
- 如果数据包包含二进制数据或超过 8000 字节限制,则数据包将
- 使用 msgpack 编码并插入辅助表
- 行 ID 在 NOTIFY 命令中发送
- 集群中的其他 Socket.IO 服务器会收到此行 ID,它们会查询表,解码数据包,然后将其广播到它们自己的连接客户端集
- 否则,数据包将直接在 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 | 两次心跳之间的时间间隔(以毫秒为单位) | 5000 |
heartbeatTimeout | 在将节点视为已关闭之前,没有心跳的时间间隔(以毫秒为单位) | 10000 |
cleanupInterval | 两次清理查询之间的时间间隔(以毫秒为单位) | 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 月 | 链接 |