Redis ETIMEDOUT ошибка после некоторого времени подключения - PullRequest
1 голос
/ 10 июля 2019

Обзор

В двух отдельных экземплярах Azure на первом запущены серверы node.js, которые подключаются к серверу redis с одним узлом, работающем на втором экземпляре, а node.js пытается сохранить активное соединение с redis. Модуль Redis узла используется для хранения и извлечения данных в Redis, а модуль socket.io-emitter позволяет различным серверам отправлять сообщения на основе коллективного подключения клиентов.

Проблема

После того, как начальное соединение выполнено через некоторое время (спорадическое), соединение зависает и, в конечном итоге, завершается с ошибкой ETIMEDOUT, генерируемой со всех серверов.

Что я пробовал.

я. Сначала добавляется socket_keepalive, а затем вместе с socket_initialdelay

const redis = require('redis');
let options = {socket_keepalive : true, socket_initialdelay : 200000};
global.client = redis.createClient(port, host, options);

II. С socket.io-emitter модуль попытался инициализировать его с новым объектом redis, используя сам модуль redis узла, но уведомления перестали работать после этого, так что он вернулся к тому же самому.

Это остановило уведомление устройств индивидуально

let options = {socket_keepalive : true, socket_initialdelay : 200000};
let redis_socket = require('redis');
let pub = redis_socket.createClient(port, host, options);
let ioz = require('socket.io-emitter')(pub);

* Очевидно, что проблема с тайм-аутом существует в рабочем методе.

III. На сервере redis конфигурация тайм-аута установлена ​​на 0, а tcpdelay была 300 секунд, но мы попытались изменить его на 0 (tcpdelay), но проблема все еще сохраняется.

Это определенно ломает мне голову, потому что тот же кусок кода работает в другой среде, но что является причиной этого, все еще остается загадкой, изучив немного больше, я понял, что клиенты, подключенные (доступны с помощью команды monitor), через некоторое время отключаются и, следовательно, etimedout ошибка выбрасывается.

Та же машина redis также используется для кэширования и работает без проблем.

1 Ответ

0 голосов
/ 23 июля 2019

Похоже, что вы можете достичь TCP простоя 4 минуты .

Согласно самодокументированной конфигурации для Redis 3.2 , значение для tcp-keepalive должно быть ненулевым, чтобы оно работало. Поэтому вы можете вместо этого установить значение, например 120 (240/2), и повторить попытку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...