即使 Redis 不可用,也会在启动时建立 'connection retry' 行为

Establish 'connection retry' behaviour on start-up even when Redis is not available

node-redis 具有出色的功能,可在一切正常且 运行 后处理任何 Redis 断开连接。如果 Redis 实例变得不可用,使用适当的 retry_strategy 意味着客户端可以设置为尝试重新连接,直到 Redis 再次可用。

是否可以让客户端在启动时进入这个状态,即使Redis宕机了?

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

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

我可以编写代码来重试初始 Redis 连接,直到成功为止,但令我印象深刻的是,开箱即用的功能已经非常接近我需要的功能,如果我能说服它的话即使 Redis 已关闭,也能从启动开始发挥作用。

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

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

您可以稍后决定连接后的处理方式

retry_strategy 实际上可以 return 一个毫秒数 以尝试在该时间后重试连接。如果连接在您的节点启动时关闭,您可以简单地 return 例如当错误代码为 NR_CLOSED 或 ECONNREFUSED 时为 5000,使其在 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});