Обзор
В двух отдельных экземплярах 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 также используется для кэширования и работает без проблем.