Spec-Zone.ru › Socket.IO 4

Postgres адаптер

Как это работает

Адаптер Postgres полагается на команды NOTIFY и LISTEN.

Каждый пакет, который отправляется нескольким клиентам (например, io.to("room1").emit() или socket.broadcast.emit()),:

  • отправляется всем соответствующим клиентам, подключенным к текущему серверу
  • если пакет содержит двоичные данные или превышает лимит в 8000 байтов, пакет:
  • кодируется с помощью msgpack и вставляется во вспомогательную таблицу
  • ID строки отправляется в команде NOTIFY
  • этот ID строки получает другие серверы Socket.IO кластера, которые обращаются к таблице, декодируют пакет и затем транслируют его своему собственному набору подключенных клиентов
  • в противном случае пакет просто отправляется в команде NOTIFY и принимается другими серверами Socket.IO кластера
  • Diagram of how the Postgres adapter works

    Исходный код этого адаптера можно найти здесь.

    Установка

    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:

    Diagram 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);

    Обратитесь к шпаргалке здесь.

    © 2014–2021 Automattic
    Licensed under the MIT License.
    https://socket.io/docs/v4/postgres-adapter

    Spec-Zone.ru

    Настройки Оффлайн Что нового Помощь О нас
    Spec-Zone .ru
    спецификации, руководства, описания, API