использование StackExchange.Redis с ElastiCache

Я планирую использовать синтаксис ConnectionMultiplexer.Connect("server1:6379,server2:6379") с комбинацией адресов и номеров портов для каждого узла в группе репликации ElastiCache (в терминах AWS).

Будет ли библиотека обрабатывать мертвые/неотвечающие узлы, автоматически передавая команды активным узлам?
Будет ли библиотека автоматически обнаруживать, что отказавший узел теперь снова доступен/новые узлы, добавленные в группу репликации?


person nirw    schedule 17.08.2015    source источник
comment
Вы имеете в виду библиотеку StackExchange.Redis?   -  person thepirat000    schedule 14.10.2015
comment
Да — это   -  person nirw    schedule 14.10.2015


Ответы (1)


Я не знаком с 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;

Я получил три типа исключений при выключении/падении разных серверов: RedisServerException, RedisConnectionException и TimeoutException. И перестал получать исключения после того, как сервер/кластер снова заработает.

person thepirat000    schedule 14.10.2015
comment
В случае, если запрос обращается к узлу, который не работает, будет ли он пытаться отправить запрос другим известным узлам или просто выдаст исключение? - person nirw; 14.10.2015
comment
Я думаю, это будет зависеть от момента, когда сервер выйдет из строя. Вероятно, вы получите MOVED RedisServerException, если кластер восстанавливается, или CLUSTERDOWN, если кластер не смог восстановиться. Ни в том, ни в другом случае вам не нужно заново создавать мультиплексор. - person thepirat000; 14.10.2015