我已经使用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秒后才能生效。
有什么建议吗?
答案 0 :(得分: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
选项吗?
如果我指定了错误的帐户名,我仍然无法重现该错误。我几乎立即收到以下错误:
Redis连接到 myincorrectaccountname.redis.cache.windows.net:6380失败- getaddrinfo ENOTFOUND myincorrectaccountname.redis.cache.windows.net