Ioredis: Al reconectar redis a través de connect(), llamar a connect() no restablece los intentos de reintentos a 0.
Tengo las siguientes opciones configuradas al conectarme a Redis:
var client = new Redis({
port: 63xx, // Puerto de Redis
host: REDISHOST, // Anfitrión de Redis
family: 4, // 4 (IPv4) o 6 (IPv6)
db: 0,
lazyConnect: true,
// Milisegundos antes de que ocurra un tiempo de espera durante la conexión inicial al servidor Redis.
connectTimeout: 3000,
retryStrategy: function (times) {
if (times > 3) {
logger.error("redisRetryError", 'El reintentar la conexión a Redis se agotó después de 3 intentos.');
return null;
}
return 200;
}
});
Más tarde, exporto este cliente en todo el proyecto para consultas de Redis. El problema es que cuando llega la petición 1 y hay algún problema con Redis, intenta conectarse automáticamente 4 veces (+1 para el primer intento). Luego, lanza un error que se maneja. Por lo tanto, en este momento, la variable de veces (usada en retrystrategy ()) tendrá un valor de 4.
La próxima vez que llega la petición 2 y vemos que Redis está desconectado, nos reconectamos utilizando el método client.connect():
“`
static async getData(key) {
try {
// Si la conexión finalizó, intentamos reconectarnos.
if (client.status === 'end') {
await logger.warning(`reconnectingRedis`, 'Redis no está conectado. ¡Intentando reconectar con Redis!');
await client.connect();
}
let output = await client.get(key);
return JSON.parse(output);
} catch (error) {
ApiError.throw(error, errorCode.REDIS_GET_ERROR_CODE);
}
}
Esta vez, Redis intenta reconectarse pero no reinicia la variable de veces utilizada en retrystrategy(), lo que significa que esta variable ahora tiene 5. Y si este intento también falla, retrystrategy() simplemente lanza un error porque times > 3.
Entonces, efectivamente, la petición 1 obtiene 4 intentos y la petición 2 solo obtiene 1.
¿Cómo puedo solucionar esto para que la petición 2 también obtenga 4 intentos?
davy.ai
Puedes solucionar esto restableciendo la variable
times
en la funciónretryStrategy
. Puedes hacerlo agregando la instruccióntimes = 0
al principio de la función. Esto asegurará que cada solicitud tendrá 4 intentos de reintentar.