Установите поведение «повторная попытка подключения» при запуске, даже если Redis недоступен.

node-redis имеет фантастическую функциональность для обработки любых отключений Redis, когда все запущено и работает. Если экземпляр Redis становится недоступным, использование соответствующего retry_strategy означает, что клиент может быть настроен на попытку повторного подключения до тех пор, пока Redis снова не станет доступен.

Можно ли заставить клиент входить в это состояние при запуске, даже если Redis не работает?

Мой сценарий таков: я использую Redis в качестве основного хранилища данных с резервным вторичным хранилищем данных, которое не основано на Redis. Когда мое приложение запускается, если Redis недоступен, попытки получить данные будут использовать вместо этого вторичное хранилище данных.

Однако, когда Redis станет доступным, я бы хотел, чтобы мое приложение вместо этого начало использовать первичное хранилище данных Redis. Поскольку при запуске соединение с Redis не удалось, retry_strategy, который обрабатывал бы это для ранее установленного соединения, не работает.

Я мог бы написать код, который будет повторять первоначальное подключение к Redis до тех пор, пока оно не будет успешным, но меня поражает, что функциональность, доступная «из коробки», уже очень близка к тому, что мне нужно, если я смогу убедить его вступить в игру из запуск, даже если Redis не работает.


person Holf    schedule 23.08.2017    source источник


Ответы (2)


По умолчанию клиент будет пытаться переподключиться до тех пор, пока не будет установлено соединение. Если вы хотите настроить Это. вы можете знать, когда Redis подключен, так как он будет генерировать событие

client.on("connect", function (){
});

вы можете позже решить, как обрабатывать после подключения

person marvel308    schedule 23.08.2017
comment
Но попытается ли он переподключиться таким образом, даже если Redis недоступен при запуске? - person Holf; 23.08.2017
comment
в их документах говорится, что он будет продолжать попытки переподключения, вы можете проверить это, прослушав упоминание о переподключении в github.com/NodeRedis/node_redis#повторное подключение - person marvel308; 23.08.2017
comment
попробуйте подключиться к автономному серверу и прослушайте событие повторного подключения, чтобы проверить - person marvel308; 23.08.2017

На самом деле retry_strategy может возвращать число в миллисекундах, чтобы попытаться повторить попытку подключения по истечении этого времени. Если соединение закрыто при запуске вашего узла, вы можете просто вернуть, например. 5000, если код ошибки NR_CLOSED или ECONNREFUSED, чтобы повторить попытку через 5 секунд.

Пример:

const retry_strategy = function(options) {
    if (options.error && (options.error.code === 'ECONNREFUSED' || options.error.code === 'NR_CLOSED')) {
        // Try reconnecting after 5 seconds
        console.error('The server refused the connection. Retrying connection...');
        return 5000;
    }
    if (options.total_retry_time > 1000 * 60 * 60) {
        // End reconnecting after a specific timeout and flush all commands with an individual error
        return new Error('Retry time exhausted');
    }
    if (options.attempt > 50) {
        // End reconnecting with built in error
        return undefined;
    }
    // reconnect after
    return Math.min(options.attempt * 100, 3000);
}

И создайте клиент с этой стратегией повтора:

const client = redis.createClient({retry_strategy: retry_strategy});
person HubbyDubDub    schedule 22.03.2018