Node-redis: Las suscripciones no reciben datos después de volver a conectarse

Creado en 5 jul. 2017  ·  6Comentarios  ·  Fuente: NodeRedis/node-redis

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.

bug

Comentario más útil

Ok, finalmente puedo reproducir de manera confiable. Hay algunos requisitos:

  • redis 3.2.0 - DEBE establecer tcp-keepalive 0
  • configurar un canal
  • configurar el script de nodo para conectarse y suscribirse al canal
  • espera 2 horas y 1 minuto

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.

Todos 6 comentarios

@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:

  • redis 3.2.0 - DEBE establecer tcp-keepalive 0
  • configurar un canal
  • configurar el script de nodo para conectarse y suscribirse al canal
  • espera 2 horas y 1 minuto

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"
¿Fue útil esta página
0 / 5 - 0 calificaciones