В нашей конфигурации Redis мы установили тайм-аут: 7 секунд
В 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] [FATAL] Производство - Соединение прервано на конце с '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 мс [это зависит от времени ожидания в очереди команд. Первый в очереди парень имеет максимальное время ответа, а следующие за ним меньше]
Обычное время отклика: 1 мс
PS: Мы также зарегистрировали проблему в node_redis