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

Postgres 适配器

工作原理

Postgres 适配器依赖于 NOTIFYLISTEN 命令。

发送到多个客户端的每个数据包(例如 io.to("room1").emit()socket.broadcast.emit())都会

  • 发送到连接到当前服务器的所有匹配客户端
  • 如果数据包包含二进制数据或超过 8000 字节限制,则数据包将
    • 使用 msgpack 编码并插入辅助表
    • 行 ID 在 NOTIFY 命令中发送
    • 集群中的其他 Socket.IO 服务器会收到此行 ID,它们会查询表,解码数据包,然后将其广播到它们自己的连接客户端集
  • 否则,数据包将直接在 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
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.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 月链接

完整变更日志