Ir al contenido principal
Versión: 4.x

Adaptador Redis Streams

Cómo funciona​

El adaptador usará un stream de Redis para reenviar paquetes entre los servidores Socket.IO.

La principal diferencia con el adaptador Redis existente (que usa el mecanismo Redis Pub/Sub) es que este adaptador manejará correctamente cualquier desconexión temporal al servidor Redis y reanudará el stream sin perder ningún paquete.

información
  • un único stream se usa para todos los namespaces
  • la opción maxLen permite limitar el tamaño del stream
  • a diferencia del adaptador basado en el mecanismo Redis PUB/SUB, este adaptador manejará correctamente cualquier desconexión temporal al servidor Redis y reanudará el stream
  • si la recuperación del estado de conexión está habilitada, las sesiones se almacenarán en Redis como un par clave/valor clásico
consejo

Este adaptador también es compatible con Valkey.

Código fuente: https://github.com/socketio/socket.io-redis-streams-adapter

Características soportadas​

CaracterísticaVersión de socket.ioSoporte
Gestión de sockets4.0.0✅ SÍ (desde versión 0.1.0)
Comunicación entre servidores4.1.0✅ SÍ (desde versión 0.1.0)
Broadcast con acknowledgements4.5.0✅ SÍ (desde versión 0.1.0)
Recuperación del estado de conexión4.6.0✅ SÍ (desde versión 0.1.0)

Instalación​

npm install @socket.io/redis-streams-adapter redis

Uso​

Con el paquete redis​

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

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

await redisClient.connect();

const io = new Server({
adapter: createAdapter(redisClient)
});

io.listen(3000);

Con el paquete redis y un clúster Redis​

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

const redisClient = createCluster({
rootNodes: [
{
url: "redis://localhost:7000",
},
{
url: "redis://localhost:7001",
},
{
url: "redis://localhost:7002",
},
],
});

await redisClient.connect();

const io = new Server({
adapter: createAdapter(redisClient)
});

io.listen(3000);

Con el paquete ioredis​

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

const redisClient = new Redis();

const io = new Server({
adapter: createAdapter(redisClient)
});

io.listen(3000);

Con el paquete ioredis y un clúster Redis​

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

const redisClient = new Cluster([
{
host: "localhost",
port: 7000,
},
{
host: "localhost",
port: 7001,
},
{
host: "localhost",
port: 7002,
},
]);

const io = new Server({
adapter: createAdapter(redisClient)
});

io.listen(3000);

Opciones​

NombreDescripciónValor predeterminado
streamNameEl nombre del stream de Redis.socket.io
maxLenEl tamaño máximo del stream. Se usa recorte casi exacto (~).10_000
readCountEl número de elementos a obtener por llamada XREAD.100
sessionKeyPrefixEl prefijo de la clave usada para almacenar la sesión Socket.IO, cuando la característica de recuperación del estado de conexión está habilitada.sio:session:
heartbeatIntervalEl número de ms entre dos heartbeats.5_000
heartbeatTimeoutEl número de ms sin heartbeat antes de considerar un nodo caído.10_000

Preguntas frecuentes​

¿Todavía necesito habilitar sesiones sticky al usar el adaptador Redis Streams?​

Sí. No hacerlo resultará en respuestas HTTP 400 (estás llegando a un servidor que no conoce la sesión Socket.IO).

Más información se puede encontrar aquí.

¿Qué pasa cuando el servidor Redis está caído?​

A diferencia del adaptador Redis clásico, este adaptador manejará correctamente cualquier desconexión temporal al servidor Redis y reanudará el stream sin perder ningún paquete.

Últimas versiones​

VersiónFecha de lanzamientoNotas de lanzamientoDiff
0.2.2Mayo 2024link0.2.1...0.2.2
0.2.1Marzo 2024link0.2.0...0.2.1
0.2.0Febrero 2024link0.1.0...0.2.0
0.1.0Abril 2023link

Changelog completo