Node redis ETIMEOUT问题

问题描述 投票:0回答:1

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

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

但是,这已经运行了好几年,只是因为这一次我在主机名或密码上输入了错字,所以我注意到,如果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个回答
0
投票

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

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

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

当我输入错误密码时,一分钟后出现错误。

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

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

您可以尝试使用tls选项吗?

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

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

© www.soinside.com 2019 - 2024. All rights reserved.