Node-redis: 从 retry_strategy 返回错误不会发出 on(error) 事件

创建于 2016-07-21  ·  10评论  ·  资料来源: NodeRedis/node-redis

  • 版本:节点 4.2.1,redis 2.6.2
  • 平台:Mac OS 10.11.5
  • 说明

我们已经实现了一个 retry_strategy,它会在一定数量的重试后发出错误。 然后这将冒泡到 Redis 的 on('error') 处理程序以进行记录并退出应用程序。 当将我们的 redis 库从2.4.22.6.2我们注意到这种行为不再相同。

重现案例:

const redis = require('redis');
const MAX_ATTEMPTS = 10;
var client = redis.createClient(port, host, { 
  retry_strategy: redisRetryStrategy
});
client.on('error', onError);

function OnError(err) {
  console.log(err);
  throw new Error('SHUTDOWN THE APP, REDIS IS NOT RESPONDING??');
}

function redisRetryStrategy(host, options) {
  if (options.attempt >= MAX_ATTEMPTS) {
    // Stop reconnecting after reaching the maximum number of attempts
    return new Error('Maximum redis reconnect attempts reached');
  }
  return 1000; // Schedule next reconnection attempt after 1 sec.
}

最有用的评论

是:将错误冒泡到错误侦听器

所有10条评论

这实际上是有意为之。 原因是您已经有了客户端失败的信息,因此不必再发出它。 这确实不是保持 semver 运行的好改变:/对此我很抱歉。

我想进行一个小型民意调查,看看其他人在想什么。 平@NodeRedis/贡献者@dirkbonhomme

是:将错误冒泡到错误侦听器

否:保留当前解决方案

只是为了提供一个支持前者的用例, connect-redis提供了一个logErrors选项,如果错误没有冒泡,它就会(非明显地)与retry_strategy互斥。

new RedisStore({
  logErrors: (err) => console.error, // does nothing
  retry_strategy: (options) => {
    if (options.error.code === 'ECONNREFUSED' || options.error.code === 'ENOTFOUND') {
      return new Error('The server could not be found or refused the connection');
    }
    return 1000;
  }
})

@tj

我认为当前的功能很好,只要它在文档中,事实并非如此。 我认为添加一个仍然会冒泡从重试策略返回的错误的选项也是可以接受的。
前任。:

redis.createClient({
    retry_strategy: ...,
    retry_strategy_bubble_up: true or false (default to false to keep existing functionality)
});

刚刚花了最后一天试图找出错误没有被记录的原因。 现在日志记录在 retry_strategy 回调中,一切都如我所愿在我的应用程序中。

我没有抛出错误,而是手动发出错误处理程序可以捕获的错误事件:

retry_strategy: function(options) {
            logger.debug('Retry redis connection: ', options.attempt);

            // 5 mins
            if (options.total_retry_time > 1000 * 60 * 5) {
                // End reconnecting after a specific timeout and flush all commands with a individual error
                return logger.error('Redis: maximum retry time exhausted');
            }
            if (options.attempt > 5) {
                // End reconnecting with built in error
                logger.error('Redis: maximum connection retry reached');
                return client.emit('error', 'maximum retry');
            }
            return 1000 * 2;
        },

冒泡 ! (或者是其他东西)

@alannesta写的自定义错误发射器很混乱, retry_strategy是构造函数的参数之一,它不应该访问函数外部的对象。

NodeRedis已经有了事件系统,就用吧!

由于end已被占用,这意味着“连接已关闭”,我们可以添加一个新事件(暂时将其称为“关闭”),表明“我们已竭尽所能,此连接已死,从现在开始,我们什么都不做,你最好做一些清理工作”。

我真的需要这个改变。

这个问题发生了什么吗?

是否有原因这不是固定的或只是优先级? 发出事件有什么好处? 在使用retry_strategy ,没有明显的方法可以关闭没有更多工作 redis 连接的服务,这应该是一个非常基本的用例。 最好的解决方案可能是@AaronJan建议的单独事件。

我已经发布了 v3.0.0,它现在将任何返回的retry_strategy错误冒泡到error事件侦听器。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

dotSlashLu picture dotSlashLu  ·  5评论

yuany picture yuany  ·  4评论

michaelwittig picture michaelwittig  ·  3评论

shmendo picture shmendo  ·  6评论

Mickael-van-der-Beek picture Mickael-van-der-Beek  ·  6评论