Postgres адаптер
Как это работает
Адаптер Postgres полагается на команды NOTIFY и LISTEN.
Каждый пакет, который отправляется нескольким клиентам (например, io.to("room1").emit() или socket.broadcast.emit()),:
- отправляется всем соответствующим клиентам, подключенным к текущему серверу
- если пакет содержит двоичные данные или превышает лимит в 8000 байтов, пакет:
Исходный код этого адаптера можно найти здесь.
Установка
npm install @socket.io/postgres-adapter pg
Для пользователей TypeScript, вам также может потребоваться @types/pg.
Использование
const { Server } = require("socket.io");
const { createAdapter } = require("@socket.io/postgres-adapter");
const { Pool } = require("pg");
const io = new Server();
const pool = new 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
);
`);
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 пакеты будут отправлены только тем клиентам, которые подключены к текущему серверу.
Эмиттер
Эмиттер 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);
Обратитесь к шпаргалке здесь.
© 2014–2021 Automattic
Licensed under the MIT License.
https://socket.io/docs/v4/postgres-adapter