2012-07-11 75 views
4

走在我们的redis的配置中,我们已经设置超时时间:7秒Redis的连接从接近事件

node_redis我们处理Redis的连接准备和结束事件作为

client.on("ready", function() { 
     logger.info("Connection Successfully Established to ", this.host, this.port); 
} 
client.on("end", function() { 
    logger.fatal("Connection Terminated to ", this.host, this.port); 
} 

样品日志

[2012-07-11 08:21:29.545] [致命]生产 - 连接终止 结束于'xxx9''6399'
[2012-07-11 08:21:29.803] [INFO]生产 - 连接成功建立'xxx9“6399”

但在某些情况下(最有可能的Redis正在关闭不通知客户端的连接),我们看到了越来越command queue堆积和请求正在太多时间才能得到响应[直到node-redis客户端能够感知关闭事件的时间]。在所有这些情况下,命令回叫将返回此错误Redis connection gone from close event。即使在等待之后。看起来好像这不是问题,因为通常的结束事件没有被触发。

问题似乎与此类似 - http://code.google.com/p/redis/issues/detail?id=368

这是一个已知的东西在Redis的发生?

有没有一种方法可以指定执行命令[发送和接收回复]不应该超过阈值,并在这种情况下回复错误,而不是让客户端停滞?

或者是否有其他方式在socket_timeout等情况下触发close事件?

或者我们应该从我们的redis端检查什么?我们在debug级别监视了我们的redis日志,并且我们发现没有任何与此问题相关的有用内容

当我们在调试模式下运行node-redis时,我们清楚地看到客户端被阻塞,请求堆积在命令中队列。我们在​​函数内记录了why and queue length。我们保持禁用offline_queuing

样本记录

Redis的连接从关闭事件了。 离线队列0 命令队列失败的请求的8

响应时间:30388个MS [此变化按照在命令队列的等待。第一个排队的人有下列他较少]

平常Resonse时间最大响应时间和那些:1毫秒

PS:我们已经在node_redis提起issue

+1

任何反馈?你没有标记正确的答案 – oconnecp 2014-01-08 09:22:42

回答

3

我们有一堆连接的麻烦Redis也是如此。它似乎会在没有告诉客户的情况下关闭连接。我们注意到它可能是服务器上的超时问题。这是我们使用的解决方案,自7月以来我们没有遇到任何问题。

var RETRY_EVERY = 1000 * 60 * 3; 
var startTimer = function(){ 
    console.log('Begin the hot tub!') 
    setInterval(function(){ 
     try{ 
      client.set('hot',new Date()); 
      console.log(client.get('hot')) 
     } 
     catch(e){ 
      console.log(e); 
     } 

    },RETRY_EVERY) 
}(); 

考虑到这只是每3分钟一个电话,它不应该是对性能有问题;)

+0

这个soln非常明显,但是想知道它是否应该是能够通过一些redis协议检测到timeout事件关闭的连接的客户端,并引发错误。我们只是想知道是否有这种情况。 – Tamil 2014-01-10 15:00:37

+0

您的客户端代码挂钩到“结束”工作,并且您还可以挂钩到“错误”事件并检测到问题,但这是在节点 - Redis代码或Redis服务器中的固有问题。如果没有这个代码,你将会遇到连接问题,因为他们的代码中有一个错误 – oconnecp 2014-01-10 18:59:13

2

至于oconnecp的答案,你就不能这样做:

setInterval(client.ping(), 1000 * 60 * 30); 
+0

更简洁的解决方案。谢谢 – Munim 2014-05-16 05:13:24

+0

不应该这是'setInterval(client.ping.bind(client),1000 * 60 * 30);' – 2014-11-19 17:12:03

+0

看起来像'node_redis 0.11.0'通过将'socket_keepalive'默认为'true'来“解决” 。不知道为什么这并不总是默认的,但无论如何。 – 2014-11-19 17:28:52