建立'连接重试'启动时的行为,即使Redis不可用

时间:2017-08-23 10:13:31

标签: node.js redis node-redis

一旦所有内容都启动并运行,

node-redis具有出色的功能,可以处理任何Redis断开连接。如果Redis实例变得不可用,则使用适当的retry_strategy表示客户端可以设置为尝试重新连接,直到Redis再次可用。

是否有可能让客户端在启动时进入此状态,即使Redis已关闭?

我的情况是:我使用Redis作为主数据存储,使用基于Redis的后备辅助数据存储。当我的应用程序启动时,如果Redis不可用,则尝试检索数据将改为使用辅助数据存储。

但是,当Redis确实可用时,我希望我的应用程序开始使用Redis主数据存储。由于Redis连接在启动时没有成功,retry_strategy(对于先前建立的连接将处理此问题)不起作用。

我可以编写代码来重试最初的Redis连接,直到它成功为止,但是我觉得开箱即用的功能已经非常接近我需要的功能,如果我能说服它来的话即使Redis失败,从初创公司开始发挥作用。

2 个答案:

答案 0 :(得分:3)

retry_strategy实际上可以返回一个以毫秒为单位的数字,以尝试在此之后重试连接。如果在节点启动时关闭连接,则只需返回例如当错误代码为NR_CLOSED或ECONNREFUSED以使其在5秒后重试时为5000.

示例:

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});

答案 1 :(得分:2)

默认情况下,客户端会尝试重新连接,直到连接为止。如果要自定义,可以使用选项object properties中提供的retry_strategy。你可以知道redis连接的时间,因为它会发出一个事件

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

以后您可以决定如何处理连接