Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点redis-ETIMEOUT问题_Node.js_Azure_Redis_Node Redis - Fatal编程技术网

Node.js 节点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上,以备将来请求 然而,这已经很好地工作了好几年,只是因为这一次我

我已经使用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\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