Hol*_*olf 2 redis node.js node-redis
node-redis一旦一切都启动并运行,它具有处理任何 Redis 断开连接的出色功能。如果 Redis 实例变得不可用,可以使用适当的retry_strategy方式设置客户端尝试重新连接,直到 Redis 再次可用。
是否有可能让客户端在启动时进入这个状态,即使 Redis 宕机了?
我的场景是这样的:我使用 Redis 作为主要数据存储,并带有一个不基于 Redis 的备用辅助数据存储。当我的应用程序启动时,如果 Redis 不可用,则尝试检索数据将改用辅助数据存储。
但是,当 Redis 可用时,我希望我的应用程序开始使用 Redis 主数据存储。由于 Redis 连接在启动时未成功retry_strategy,因此将为先前建立的连接处理此问题的 不起作用。
我可以编写代码来重试初始 Redis 连接,直到它成功,但让我震惊的是,开箱即用的功能已经非常接近我需要的功能,如果我能说服它从即使 Redis 已关闭,也能启动。
小智 9
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);
}
Run Code Online (Sandbox Code Playgroud)
并使用此重试策略创建客户端:
const client = redis.createClient({retry_strategy: retry_strategy});
Run Code Online (Sandbox Code Playgroud)
默认情况下,客户端将尝试重新连接,直到连接为止。如果您想自定义它,可以使用选项对象属性中可用的 retry_strategy 。你可以知道redis何时连接,因为它会发出一个事件
client.on("connect", function (){
});
Run Code Online (Sandbox Code Playgroud)
您可以稍后决定如何处理连接后的情况
| 归档时间: |
|
| 查看次数: |
5009 次 |
| 最近记录: |