在启动时建立“连接重试”行为,即使Redis不可用

ssgvzors  于 2023-04-19  发布在  Redis
关注(0)|答案(3)|浏览(128)

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

Redis宕机的情况下,客户端是否可以在启动时进入该状态?

我的场景是这样的:我使用Redis作为主数据存储,并使用一个不基于Redis的备用辅助数据存储。当我的应用程序启动时,如果Redis不可用,则尝试检索数据将使用辅助数据存储。
然而,当Redis可用时,我希望我的应用程序开始使用Redis主数据存储。由于Redis连接在启动时没有成功,因此retry_strategy无法为先前建立的连接处理此问题。
我可以编写代码,重试最初的Redis连接,直到成功,但它让我感到,如果我能说服它从启动开始发挥作用,即使Redis关闭,可用的开箱即用的功能已经非常接近我所需要的。

oxf4rvwz

oxf4rvwz1#

retry_strategy实际上可以返回一个以毫秒为单位的数字,以尝试在该时间之后重试连接。如果在节点启动时连接关闭,您可以在错误代码为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});
bttbmeg0

bttbmeg02#

默认情况下,客户端会尝试重新连接,直到连接。如果你想自定义它,你可以使用选项对象属性中的retry_strategy。你可以知道什么时候连接了redis,因为它会发出一个事件

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

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

hsvhsicv

hsvhsicv3#

在客户端选项的套接字部分中使用reconnectStrategy。在下面的示例中使用指数回退

const maxConnectRetry = 10
 const minConnectDelay = 100; // Milliseconds
 const maxConnectDelay = 60000; // Milliseconds
 
 const client = redisObj.createClient({
    socket: {
        host: host,
        port: port,
        connectTimeout: 5000,
        reconnectStrategy: (retries) => {
            if (retries > maxConnectRetry) {
                console.log("Too many retries on REDIS. Connection Terminated");
                return new Error("Too many retries.");
            } else {
                const wait = Math.min(minConnectDelay * Math.pow(2, retries), maxConnectDelay);
                console.log("waiting", wait, "milliseconds");
                return wait;
            }
        }
    },
    database: dbIndex
});

相关问题