Oye,
No puedo hacer que este módulo vuelva a conectar redis.
Tomando esta configuración:
const client = redis.createClient({
no_ready_check: false,
enable_offline_queue: true,
retry_unfulfilled_commands: true,
socket_keepalive: true,
retry_strategy: function (options) {
if (options.error && options.error.code === 'ECONNREFUSED') {
// End reconnecting on a specific error and flush all commands with
// a individual error
return new Error('The server refused the connection');
}
if (options.total_retry_time > 1000 * 60 * 60) {
// End reconnecting after a specific timeout and flush all commands
// with a individual error
return new Error('Retry time exhausted');
}
if (options.attempt > 10) {
// End reconnecting with built in error
return undefined;
}
console.log('here');
// reconnect after
return 100;
},
host: process.env.REDIS_HOST || '127.0.0.1',
port: 6379
});
Veo el here
cuando detengo mi redis local, pero luego lo reinicio de nuevo y espero cualquier cantidad de tiempo, cualquier llamada subsiguiente a redis me da:
{ AbortError: EXEC can't be processed. The connection is already closed.
at handle_offline_command (/Users/kstoney/git/autotrader/platform-alert-forwarder/node_modules/redis/index.js:851:15)
at RedisClient.internal_send_command (/Users/kstoney/git/autotrader/platform-alert-forwarder/node_modules/redis/index.js:885:9)
at Multi.exec_transaction (/Users/kstoney/git/autotrader/platform-alert-forwarder/node_modules/redis/lib/multi.js:115:18)
at Object.RedisCache.self.set (/Users/kstoney/git/autotrader/platform-alert-forwarder/lib/caches/redis.js:41:8)
at Object.sendMessage [as handle] (/Users/kstoney/git/autotrader/platform-alert-forwarder/lib/forwarders/slack.js:197:28)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
command: 'EXEC',
code: 'NR_CLOSED',
errors:
[ { AbortError: SET can't be processed. The connection is already closed.
¿Algunas ideas? Necesito algo de tolerancia a los blips de Redis.
El mismo problema sin algunas opciones como la cola fuera de línea, mi configuración es la siguiente:
var client = redis.createClient({
port: process.env.REDIS_PORT,
host: process.env.REDIS_HOST,
retry_strategy: function (options) {
if (options.error && options.error.code === 'ECONNREFUSED') {
// End reconnecting on a specific error and flush all commands with
// a individual error
logger.debug('[Redis Strategy] - Connection Refused options:', options);
return new Error('The server refused the connection');
}
if (options.total_retry_time > 1000 * 60 * 60) {
// End reconnecting after a specific timeout and flush all commands
// with a individual error
logger.debug('[Redis Strategy] - Time exhausted options:', options);
return new Error('Retry time exhausted');
}
if (options.attempt > 10) {
// End reconnecting with built in error
return undefined;
}
// reconnect after
return Math.min(options.attempt * 100, 3000);
}
});
client.on('connect', function () {
console.log('Redis client connected');
});
client.on('error', function (err) {
console.log('Something went wrong ' + err);
});
Vaya, no puedo creer que no haya notado este comportamiento.
Ejecuto mis aplicaciones con https://github.com/Unitech/pm2 , que reinicia la aplicación cada vez que ocurre una falla, por lo que esto ha pasado bastante tiempo sin ser notado.
¡Gran captura!
¿Hay otra forma de lograr la reconexión hasta que se solucione? (Veo que la última versión es de hace 2 años)
Sí, cambiamos a ioredis jaja
@Stono , estoy de acuerdo, me cambiaré a
Gracias, realmente suena mejor, no estaba familiarizado con esta biblioteca.
Sin duda alguna para este proyecto actual no podré cambiar, pero es bueno saberlo para el trabajo futuro.
Comentario más útil
Sí, cambiamos a ioredis jaja