Адаптер Redis
Как это работает
Адаптер Redis использует механизм Redis Pub/Sub.
Каждый пакет, отправленный нескольким клиентам (например, io.to("room1").emit() или socket.broadcast.emit()),:
- отправляется всем соответствующим клиентам, подключенным к текущему серверу
- опубликовывается в канале Redis и принимается другими серверами Socket.IO кластера
Исходный код этого адаптера можно найти здесь.
Установка
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:
Этот эмиттер также доступен на нескольких языках:
- 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