Dado que estoy importando estos paquetes:
import {Socket, Server} from 'socket.io'; // @4.4.1 import {createClient} from 'redis'; // @4.0.4 import {createAdapter} from '@socket.io/redis-adapter'; // @7.1.0 import {Server as HttpServer} from 'http'; // npm@8.5.5, node@v17.7.0Tengo un servidor que he creado con:
const http = HttpServer // from 'http', creation not in this code const io = new Server(http, { path: '/socket/v1/tunnel', serveClient: false, cookie: false, pingTimeout: 295000, pingInterval: 300000, });y Redis pub/sub clientes que he creado con:
const pubClient = createClient({ url: redisAddress, }); const subClient = pubClient.duplicate(); Después de tener estos, conecto los clientes de Redis y los agrego a un adaptador (en io ) con lo siguiente:
Promise.all([pubClient.connect(), subClient.connect()]).then(() => { io.adapter(createAdapter(pubClient, subClient)); ... }Con lo anterior, tengo un servidor de socket en funcionamiento. Mi problema es que cada ~1 hora se produce un error en mi conexión con los clientes de Redis. El pubClient se vuelve a conectar de inmediato (como espero que haga según la documentación), pero el subcliente falla y no se vuelve a conectar.
Puedo emitir a salas en Redis desde otros sistemas, y mientras este subcliente está conectado, los mensajes se transmiten a los dispositivos apropiados. Después de que el subcliente comete un error la primera vez (lo que ocurre de manera bastante predecible en un intervalo de aproximadamente 1 hora), no se vuelve a conectar, lo que significa que las emisiones a las salas de Redis ya no se enrutan a sus destinos.
Tengo algunas preguntas:
subClient.connect() dentro del controlador para subClient.on('error', () => {...} , o lo configuré incorrectamente y debería crear un nuevo cliente distinto con createClient({. ..})?Este problema estaba siendo causado por el paquete redis. redis@4 no se vuelve a conectar correctamente en los canales pub/sub (actualmente, v4.0.4). La degradación de redis a v3.1.2 resolvió el problema de reconexión por completo