7

我有一个有效的服务器配置,其中无法访问 redis,但服务器可以正常运行(当找不到 redis 时,我只是剥离了功能)。

但是,我无法很好地管理连接错误。我想知道连接错误何时失败并在这种情况下关闭客户端。

我发现连接重试永远不会停止。而quit() 实际上被吞了——“为下一个服务器连接排队退出。” - 调用时。

在无法建立连接的情况下,有没有办法杀死客户端?

var redis = require("redis"),
    client = redis.createClient();

client.on("error", function(err) {
    logme.error("Bonk. The worker framework cannot connect to redis, which might be ok on a dev server!");
    logme.error("Resque error : "+err);
    client.quit();
});

client.on("idle", function(err) {
    logme.error("Redis queue is idle. Shutting down...");
});

client.on("end", function(err) {
    logme.error("Redis is shutting down. This might be ok if you chose not to run it in your dev environment");
});

client.on("ready", function(err) {
    logme.info("Redis up! Now connecting the worker queue client...");
});
  • 错误 - Resque 错误:错误:Redis 连接到 127.0.0.1:6379 失败 - 连接 ECONNREFUSED
  • 错误 - Redis 正在关闭。如果您选择不在开发环境中运行它,这可能没问题
  • 错误 - Resque 错误:错误:Redis 连接到 127.0.0.1:6379 失败 - 连接 ECONNREFUSED
  • 错误 - Resque 错误:错误:Redis 连接到 127.0.0.1:6379 失败 - 连接 ECONNREFUSED
  • 错误 - Resque 错误:错误:Redis 连接到 127.0.0.1:6379 失败 - 连接 ECONNREFUSED
  • 错误 - Resque 错误:错误:Redis 连接到 127.0.0.1:6379 失败 - 连接 ECONNREFUSED

有趣的一件事是发出了“结束”事件。为什么?

4

2 回答 2

8

控制客户端重新连接行为的正确方法是使用retry_strategy

断开连接后,redisClient 将尝试按照默认行为重新连接。可以通过在创建客户端时提供 retry_strategy 来覆盖默认行为。

文档中一些细粒度控制的示例用法。

var client = redis.createClient({
    retry_strategy: function (options) {
        if (options.error && options.error.code === 'ECONNREFUSED') {
            // End reconnecting on a specific error and flush all commands with
            // a individual error
            return new Error('The server refused the connection');
        }
        if (options.total_retry_time > 1000 * 60 * 60) {
            // End reconnecting after a specific timeout and flush all commands
            // with a individual error
            return new Error('Retry time exhausted');
        }
        if (options.attempt > 10) {
            // End reconnecting with built in error
            return undefined;
        }
        // reconnect after
        return Math.min(options.attempt * 100, 3000);
    }
});

参考:https ://www.npmjs.com/package/redis#options-object-properties

为了在连接丢失时杀死客户端,我们可以使用以下 retry_strategy。

var client = redis.createClient({
    retry_strategy: function (options) {
        return undefined;
    }
});
于 2019-05-16T01:37:52.387 回答
1

您可能只想在出错时强制终止与 redis 的连接,client.end()而不是使用client.quit()which 等待所有未完成的请求完成,然后发送QUIT命令,如您所知,该命令需要与 redis 建立工作连接才能完成。

于 2012-05-03T04:27:51.833 回答