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