Spec-Zone.ru › Socket.IO 4

Адаптер Redis

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

Адаптер Redis использует механизм Redis Pub/Sub.

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

  • отправляется всем соответствующим клиентам, подключенным к текущему серверу
  • опубликовывается в канале Redis и принимается другими серверами Socket.IO кластера
Diagram of how the Redis adapter works

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

Установка

npm install @socket.io/redis-adapter redis

Для пользователей TypeScript вам также потребуется установить @types/redis, если вы используете redis@3.

Использование

import { Server } from "socket.io";
import { createAdapter } from "@socket.io/redis-adapter";
import { createClient } from "redis";

const io = new Server();

const pubClient = createClient({ url: "redis://localhost:6379" });
const subClient = pubClient.duplicate();

Promise.all([pubClient.connect(), subClient.connect()]).then(() => {
  io.adapter(createAdapter(pubClient, subClient));
  io.listen(3000);
});

Примечание: с redis@3, вызов connect() для клиентов Redis не требуется:

import { Server } from "socket.io";
import { createAdapter } from "@socket.io/redis-adapter";
import { createClient } from "redis";

const io = new Server();

const pubClient = createClient({ url: "redis://localhost:6379" });
const subClient = pubClient.duplicate();

io.adapter(createAdapter(pubClient, subClient));
io.listen(3000);

Или с ioredis:

import { Server } from "socket.io";
import { createAdapter } from "@socket.io/redis-adapter";
import { Cluster } from "ioredis";

const io = new Server();

const pubClient = new Cluster([
  {
    host: "localhost",
    port: 6380,
  },
  {
    host: "localhost",
    port: 6381,
  },
]);

const subClient = pubClient.duplicate();

io.adapter(createAdapter(pubClient, subClient));
io.listen(3000);

Параметры

Имя Описание Значение по умолчанию
key Префикс для имени канала Pub/Sub socket.io
requestsTimeout Таймаут для межсерверных запросов, таких как fetchSockets() или serverSideEmit() с подтверждением 5000

Частые вопросы

  • Нужно ли по-прежнему включать кэширование сессий при использовании адаптера Redis?

Да. Если этого не сделать, будут возвращены ответы HTTP 400 (вы обращаетесь к серверу, который не знает о сессии Socket.IO).

Дополнительную информацию можно найти здесь.

  • Что происходит, когда сервер Redis недоступен?

В случае разрыва соединения с сервером Redis пакеты будут отправлены только тем клиентам, которые подключены к текущему серверу.

Миграция с socket.io-redis

Пакет был переименован из socket.io-redis в @socket.io/redis-adapter в версии 7.0.0 для соответствия имени эмиттера Redis (@socket.io/redis-emitter).

Для миграции на новый пакет необходимо предоставить собственные клиенты Redis, так как пакет больше не будет создавать клиенты Redis от имени пользователя.

До этого:

const redisAdapter = require("socket.io-redis");

io.adapter(redisAdapter({ host: "localhost", port: 6379 }));

После:

const { createClient } = require("redis");
const { createAdapter } = require("@socket.io/redis-adapter");

const pubClient = createClient({ url: "redis://localhost:6379" });
const subClient = pubClient.duplicate();

io.adapter(createAdapter(pubClient, subClient));

Протокол связи между серверами Socket.IO не был обновлен, поэтому у вас могут быть некоторые серверы с socket.io-redis и другие с @socket.io/redis-adapter одновременно.

Последние версии

  • 7.1.0 (30 ноября 2021 г.)
  • 7.0.1 (15 ноября 2021 г.)
  • 7.0.0 (12 мая 2021 г.)
  • 6.1.0 (13 марта 2021 г.)
  • 6.0.1 (14 ноября 2020 г.)

Эмиттер

Эмиттер Redis позволяет отправлять пакеты подключенным клиентам из другого процесса Node.js:

Diagram of how the Redis emitter works

Этот эмиттер также доступен на нескольких языках:

  • Javascript: https://github.com/socketio/socket.io-redis-emitter
  • Java: https://github.com/sunsus/socket.io-java-emitter
  • Python: https://pypi.org/project/socket.io-emitter/
  • PHP: https://github.com/rase-/socket.io-php-emitter
  • Golang: https://github.com/yosuke-furukawa/socket.io-go-emitter
  • Perl: https://metacpan.org/pod/SocketIO::Emitter
  • Rust: https://github.com/epli2/socketio-rust-emitter

Установка

npm install @socket.io/redis-emitter redis

Использование

import { Emitter } from "@socket.io/redis-emitter";
import { createClient } from "redis";

const redisClient = createClient({ url: "redis://localhost:6379" });

redisClient.connect().then(() => {
  const emitter = new Emitter(redisClient);

  setInterval(() => {
    emitter.emit("time", new Date);
  }, 5000);
});

Примечание: с redis@3, вызов connect() для клиента Redis не требуется:

import { Emitter } from "@socket.io/redis-emitter";
import { createClient } from "redis";

const redisClient = createClient({ url: "redis://localhost:6379" });
const emitter = new Emitter(redisClient);

setInterval(() => {
  emitter.emit("time", new Date);
}, 5000);

См. шпаргалку здесь.

Миграция с socket.io-emitter

Пакет был переименован из socket.io-emitter в @socket.io/redis-emitter в версии 4.0.0 для лучшего отражения связи с Redis.

Для миграции на новый пакет необходимо предоставить собственные клиенты Redis, так как пакет больше не будет создавать клиенты Redis от имени пользователя.

До этого:

const io = require("socket.io-emitter")({ host: "127.0.0.1", port: 6379 });

После:

const { Emitter } = require("@socket.io/redis-emitter");
const { createClient } = require("redis");

const redisClient = createClient();
const io = new Emitter(redisClient);

Последние версии

  • 4.1.1 (4 января 2022 г.)
  • 4.1.0 (12 мая 2021 г.)
  • 4.0.0 (17 марта 2021 г.)
  • 3.2.0 (29 декабря 2020 г.)
  • 3.1.1 (12 октября 2017 г.)

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

Spec-Zone.ru

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