使用StackExchange.Redis与ElastiCache

10

我计划使用ConnectionMultiplexer.Connect("server1:6379,server2:6379")语法,其中包括ElastiCache复制组中每个节点的地址和端口号组合(在AWS术语中)。

这个库会自动处理死节点/无响应节点,并将命令自动传递给活动节点吗?
这个库会自动发现故障节点已经可用/新节点已添加到复制组吗?


你是在指 StackExchange.Redis 库吗? - thepirat000
是的 - 这个 - nirw
1个回答

5

我不熟悉Elasticache,但是StackExchange.Redis的ConnectionMultiplexer会在后台自动重试,如果连接断开,它还会发现已恢复的节点。

当然,在访问数据库时出现故障时,您会收到异常,但是如果正确处理错误,您将无需重新创建ConnectionMultiplexer

我使用以下代码测试了集群模式和独立模式:

var mul = ConnectionMultiplexer.Connect("192.168.15.15:7000,192.168.15.15:7001,...,connectRetry=10,syncTimeout=5000,abortConnect=false,keepAlive=10,allowAdmin=true");
RETRY:
    Thread.Sleep(1000);
    var k = Guid.NewGuid().ToString();
    var v = Guid.NewGuid().ToString();
    try
    {
        var db = mul.GetDatabase();
        db.StringSet(k, v);
        if (db.StringGet(k).ToString() != v)
        {
            throw new OperationCanceledException("ABORT");
        }
    }
    catch(RedisServerException ex)
    {
        Console.WriteLine("Redis Server Exception {0}", ex.Message);
        goto RETRY;
    }
    catch(RedisConnectionException ex)
    {
        Console.WriteLine("Redis Connection Exception {0}", ex.Message);
        goto RETRY;
    }
    catch(TimeoutException ex)
    {
        Console.WriteLine("Timeout Exception {0}", ex.Message);
        goto RETRY;
    }
    Console.WriteLine("OK");
    goto RETRY;

当关闭/崩溃不同的服务器时,我收到了三种异常类型:RedisServerExceptionRedisConnectionExceptionTimeoutException。一旦服务器/集群重新运行起来,就不再收到异常。


如果请求尝试连接一个已经宕机的节点,它会尝试将请求发送到其他已知的节点吗?还是直接抛出异常? - nirw
我认为这将取决于服务器故障的时间。如果集群正在恢复中,则可能会收到MOVED RedisServerException,或者如果集群无法恢复,则为CLUSTERDOWN。在任何情况下,您都不需要重新创建多路复用器。 - thepirat000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接