node_redis : 2.7.1
redis : 3.2
plataforma : Amazon linux
descripción:
Cuando se produce la instantánea de redis, se desconecta el cliente de redis. El cliente se vuelve a conectar y se vuelve a suscribir, sin embargo, ya no recibe datos. Esto se puede reproducir emitiendo un comando SAVE
través de redis-cli.
JS
const redis = require('redis');
const redisClient = redis.createClient({
host: config.redisEndpoint,
port: config.redisPort,
});
redisClient.on('connect', () => {
console.log('Connected to Redis');
console.log('subscription_set:', redisClient.subscription_set);
});
redisClient.on('reconnecting', (stats) => {
console.log('Reconnecting to Redis', stats);
});
redisClient.on('error', (error) => {
console.log('Failed to connect to Redis: ', error);
});
redisClient.on('subscribe', (channel, count) => { // eslint-disable-line no-unused-vars
console.log('Subscribed to: ', channel, count);
});
redisClient.on('message', (channel, message) => { // eslint-disable-line no-unused-vars
console.log('Received from: ', channel, message);
});
redisClient.subscribe('test');
Registros
Conexión inicial
info: Connected to Redis
info: subscription_set:
info: Subscribed to: test 1
Emitir un comando SAVE en redis-cli
info: Error: Redis connection to 34.213.3.19:6379 failed - read ECONNRESET
info: Reconnecting to Redis delay=983, attempt=4, code=ECONNRESET, errno=ECONNRESET, syscall=connect, address=127.0.0.1, port=6379, total_retry_time=1118, times_connected=1
info: Connected to Redis
info: subscription_set: subscribe_test=test
info: Subscribed to: test 1
Es en este punto que el cliente ya no recibirá ningún dato publicado en la prueba del canal. Si tiene alguna pregunta o necesita más información para reproducir, hágamelo saber.
@BridgeAR @iamjem Podría estar relacionado con el # 1249
Gracias por su descripción detallada, sin embargo, aún no he podido reproducirla. Cuando emito un SAVE
través de redis-cli, la conexión no se restablece.
Cuando detengo manualmente el servidor redis y lo inicio de nuevo, parece que los mensajes están bien.
He estado probando esto en Mac, intentaré reproducirlo también en Linux
Hmmm ... eso es interesante. Estaba ocurriendo con una instalación de redis totalmente original construida desde la fuente. La única opción que cambié fue permitir conexiones remotas. Echaré un vistazo en breve y veré si puedo averiguar qué pasa. @jdegger
@jdegger No puedo reproducir localmente, solo en AWS bajo condiciones súper específicas. Puedo crear una segunda copia de esta AMI y proporcionar un código que le permitirá reproducirlo, pero aparentemente es algo específico para ejecutar en AWS. Avíseme si está interesado ... de lo contrario, diría que siga adelante y cierre el problema
Ok, finalmente puedo reproducir de manera confiable. Hay algunos requisitos:
tcp-keepalive 0
Lo que verá es que cada 2 horas (al menos para mí) es un error ECONNRESET. En este punto, parece que el socket todavía está abierto en redis, pero tal vez el proceso del nodo ha perdido una referencia y ha abierto un nuevo socket. De la noche a la mañana tuve como 1 cliente conectado por bloque de 2 horas más el proceso actualmente en ejecución al emitir CLIENT LIST
de redis-cli.
Es importante tener en cuenta que todos los clientes se volvieron a conectar correctamente pero no recibieron datos. Tengo el presentimiento de que los datos se estaban expulsando, pero a la conexión anterior no a la nueva ... pero eso es totalmente una corazonada.
Ahora, no estoy 100% seguro si se trata de un error de node_redis o en realidad de un error con el nodo, así que si este es el lugar incorrecto para archivar, házmelo saber. Estaría feliz de intentar depurar / avanzar, pero tengo un tiempo limitado.
La solución fue establecer tcp-keepalive 300
que mantiene la conexión activa ... pero esto se siente inestable ya que el cliente debería poder reconectarse con éxito.
@shmendo
Nuestro también muestra que el error ECONNRESET ocurre cada 2 horas. Pero verifiqué tcp-keepalive, es 300
CONFIG GET tcp-keepalive
1) "tcp-keepalive"
2) "300"
Comentario más útil
Ok, finalmente puedo reproducir de manera confiable. Hay algunos requisitos:
tcp-keepalive 0
Lo que verá es que cada 2 horas (al menos para mí) es un error ECONNRESET. En este punto, parece que el socket todavía está abierto en redis, pero tal vez el proceso del nodo ha perdido una referencia y ha abierto un nuevo socket. De la noche a la mañana tuve como 1 cliente conectado por bloque de 2 horas más el proceso actualmente en ejecución al emitir
CLIENT LIST
de redis-cli.Es importante tener en cuenta que todos los clientes se volvieron a conectar correctamente pero no recibieron datos. Tengo el presentimiento de que los datos se estaban expulsando, pero a la conexión anterior no a la nueva ... pero eso es totalmente una corazonada.
Ahora, no estoy 100% seguro si se trata de un error de node_redis o en realidad de un error con el nodo, así que si este es el lugar incorrecto para archivar, házmelo saber. Estaría feliz de intentar depurar / avanzar, pero tengo un tiempo limitado.
La solución fue establecer
tcp-keepalive 300
que mantiene la conexión activa ... pero esto se siente inestable ya que el cliente debería poder reconectarse con éxito.