Node Redis服务宕机时错误回调重复触发,如何设置仅触发一次?
问题根因
node-redis 默认开启了自动重连机制,每次重连失败都会触发 error 事件,因此会持续打印错误日志。
实现单次宕机通知的方案
方案1:添加状态标记位(推荐,不影响自动重连)
通过标记位控制仅第一次报错时触发通知,服务恢复后自动重置标记,下次宕机可再次触发通知:
var redis = require("redis"); var client = redis.createClient(); // 错误通知状态标记 let isRedisDownNotified = false; client.on("error", function(error) { if (!isRedisDownNotified) { console.log("Redis 服务已宕机"); // 此处可添加自定义告警逻辑,如推送、邮件通知等 isRedisDownNotified = true; } }); // 连接恢复时重置标记 client.on("connect", function() { if (isRedisDownNotified) { console.log("Redis 服务已恢复连接"); isRedisDownNotified = false; } });
方案2:关闭自动重连(适合不需要自动恢复的场景)
直接关闭客户端的自动重连逻辑,报错后不会再尝试重连,error 事件仅触发一次:
node-redis v3 版本配置:
var client = redis.createClient({ retry_strategy: function() { // 返回false关闭自动重连 return false; } });
node-redis v4+ 版本配置:
var client = redis.createClient({ socket: { reconnectionStrategy: false } });
注意:该方案关闭自动重连后,Redis 恢复服务后客户端不会主动重新连接,需要手动触发重连。
方案3:单次事件绑定
通过 once 方法绑定单次 error 监听,连接恢复后重新绑定监听:
var redis = require("redis"); var client = redis.createClient(); function bindRedisErrorListener() { client.once("error", function(error) { console.log("Redis 服务已宕机"); // 自定义告警逻辑 }); } // 初始化绑定错误监听 bindRedisErrorListener(); // 连接恢复后重新绑定单次监听 client.on("connect", function() { console.log("Redis 服务已恢复连接"); bindRedisErrorListener(); });
内容的提问来源于stack exchange,提问作者Shai UI
相关产品推荐
相关产品推荐

