在我们的 redis 配置中,我们设置了 timeout: 7 seconds
在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] [信息] 生产 - 连接成功建立到' xxx9' '6399'
但是在某些情况下(很可能 redis 正在关闭连接而不通知客户端)我们看到命令队列堆积起来并且请求花费了太多时间来获得响应[直到 node-redis 客户端能够感知到关闭事件的时间]。在所有此类情况下,都会返回带有此错误的命令回调Redis connection gone from close event
。即使经过这么多的等待。由于没有触发通常的结束事件,因此看起来这不是问题。
问题似乎与此类似 - http://code.google.com/p/redis/issues/detail?id=368
这是redis中发生的已知事情吗?
有没有办法指定命令的执行[发送和接收回复]不应该超过阈值并在这种情况下回复错误,而不是让客户端停止?
或者在像socket_timeout这样的情况下还有其他触发关闭事件的方法吗?
或者我们应该从我们的 redis 方面检查一些东西?我们在级别上监控了我们的 redis 日志,debug
但没有发现与此问题相关的任何有用信息
当我们在调试模式下运行 node-redis 时,我们可以清楚地看到客户端因请求堆积在命令队列中而停滞不前。我们在flush_on_error函数中记录了原因和队列长度。我们一直禁用offline_queuing 。
样本日志
Redis 连接已从关闭事件中消失。离线队列 0 命令队列 8
请求失败的响应时间:30388 ms [这取决于命令队列中的等待时间。第一个排队的人的响应时间最长,后面的人响应时间更短]
通常的响应时间:1 毫秒
PS:我们也在 node_redis中提交了一个问题