【问题标题】:Node redis ETIMEOUT issue节点redis ETIMEOUT问题
【发布时间】:2020-02-13 11:10:55
【问题描述】:

我使用 node-redis 已经有一段时间了,到目前为止一切都很好。但是,在设置新环境时,我的主机名(或密码)输入错误,无法连接。但是因为这是我前段时间开发的一个已经可以运行的应用程序,所以很难跟踪实际问题。当您向该服务器发出请求时,它只需要服务器超时 5 分钟,然后返回错误 500。

最后我发现这是redis服务器的凭据。我使用 redis 通过阻止重新验证安全令牌长达一个小时(因为验证过程可能需要长达 2000 毫秒)来使我的应用程序更快,因此我将令牌存储在 redis 上以供将来请求。

这多年来一直运行良好,但是,只是因为这次我在主机名或密码上输入错误,我注意到如果 redis 服务器无法连接(无论出于何种原因),整个应用程序都会崩溃。这个想法是,如果可用,应该使用 redis,如果没有,它应该回退到只走很长的路,但无论如何都要满足请求。

所以我的问题是,如何告诉node-redis尽快抛出错误,而不是等到ETIMEOUT错误来?

例如:

const client = redis.createClient(6380, "redis.host.com", { password: "verystrongone" } });
client.on("error", err => {
    console.log(err)
})

根据此代码,我在达到超时(大约 30-40 秒)后收到 console.log 错误。这不好,因为那时我的应用程序至少有 30 秒没有响应。我想要实现的是,如果redis出现故障或其他情况,它应该在2-5秒后放弃。我使用来自 Azure 的非常快速且可靠的 redis 服务器。连接只需不到一秒的时间,而且我相信从未失败过,但如果失败了,它将占用整个应用程序。

我尝试了retry_strategy 之类的东西,但我相信该选项仅在最初的约 30 秒尝试后才会生效。

有什么建议吗?

【问题讨论】:

    标签: node.js azure redis node-redis


    【解决方案1】:

    所以这是我观察到的一件有趣的事情。

    当我使用以下选项连接到 redis 缓存实例时,我能够重现您遇到的错误。

        port: 6380,
        host: myaccount.redis.cache.windows.net,
        auth_pass: mysupersecretaccountkey
    

    当我指定错误的密码时,我会在 1 分钟后收到错误消息。

    但是,如果我指定 tls 参数,我几乎会立即收到错误:

        port: 6380,
        host: myaccount.redis.cache.windows.net,
        auth_pass: mysupersecretaccountkey,
        tls: {
          servername: myaccount.redis.cache.windows.net
        }
    

    你可以试试tls 选项吗?

    如果我指定了错误的帐户名,我仍然无法重现错误。我几乎立即收到以下错误:

    Redis 连接到 myincorrectaccountname.redis.cache.windows.net:6380 失败 - getaddrinfo ENOTFOUND myincorrectaccountname.redis.cache.windows.net

    【讨论】:

      猜你喜欢
      • 2016-05-15
      • 2011-12-19
      • 2023-03-22
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 2013-10-20
      • 2018-09-03
      • 2015-10-27
      相关资源
      最近更新 更多