我使用node-redis已经有一段时间了,到目前为止还不错。然而,在设置一个新环境时,我的主机名(或密码)有一个拼写错误,它无法连接。但因为这是我前段时间开发的一个已经可以正常工作的应用程序,所以很难跟踪实际问题。当您对此服务器发出请求时,它只会占用服务器的超时时间,即5分钟,然后返回错误500。
最后,我发现这是redis服务器的凭据。我使用redis来让我的应用程序更快,因为我最多会在一个小时内阻止重新验证安全令牌(因为验证过程可能需要2000ms),所以我将令牌存储在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秒尝试之后才会生效。
有什么建议吗?
发布于 2020-02-13 11:10:55
这是我观察到的一件有趣的事情。
当我使用以下选项连接到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选项吗?
如果我指定了不正确的帐户名,我仍然无法重现错误。我几乎在瞬间就得到了以下错误:
与myincorrectaccountname.redis.cache.windows.net:6380的
Redis连接失败- getaddrinfo ENOTFOUND Redis
https://stackoverflow.com/questions/60198962
复制相似问题