Node.js 节点redis-ETIMEOUT问题
我已经使用node redis一段时间了,到目前为止还不错。然而,在建立一个新环境时,我的主机名(或密码)被输入错误,无法连接。但因为这是我不久前开发的一个已经在运行的应用程序,所以很难跟踪实际问题。当您对该服务器发出请求时,它只会占用服务器的超时时间5分钟,然后返回错误500 最后我发现这是redis服务器的凭据。我使用redis阻止重新验证安全令牌长达一小时(因为验证过程可能需要长达2000毫秒),因此我将令牌存储在redis上,以备将来请求 然而,这已经很好地工作了好几年,只是因为这一次我在主机名或密码上有一个输入错误,我注意到如果redis服务器无法连接(无论出于什么原因),整个应用程序都会崩溃。我们的想法是,如果redis可用,就应该使用它,如果不可用,它应该回退,只走很长的路,但无论如何都要满足请求 所以我的问题是,如何告诉node redis尽快抛出错误,而不是等到ETIMEOUT错误出现 例如:Node.js 节点redis-ETIMEOUT问题,node.js,azure,redis,node-redis,Node.js,Azure,Redis,Node Redis,我已经使用node redis一段时间了,到目前为止还不错。然而,在建立一个新环境时,我的主机名(或密码)被输入错误,无法连接。但因为这是我不久前开发的一个已经在运行的应用程序,所以很难跟踪实际问题。当您对该服务器发出请求时,它只会占用服务器的超时时间5分钟,然后返回错误500 最后我发现这是redis服务器的凭据。我使用redis阻止重新验证安全令牌长达一小时(因为验证过程可能需要长达2000毫秒),因此我将令牌存储在redis上,以备将来请求 然而,这已经很好地工作了好几年,只是因为这一次我
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\u策略
的方法,但我相信只有在最初的~30秒尝试后,该选项才会生效
有什么建议吗?我观察到了一件有趣的事情 当我使用以下选项连接到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
选项吗
如果我指定了错误的帐户名,我仍然无法再现错误。我几乎是在瞬间得到以下错误:
port: 6380,
host: myaccount.redis.cache.windows.net,
auth_pass: mysupersecretaccountkey,
tls: {
servername: myaccount.redis.cache.windows.net
}
Redis连接到
myincorrectaccountname.redis.cache.windows.net:6380失败-
getaddrinfo ENOTFOUND myincorrectaccountname.redis.cache.windows.net