2015-08-17 25 views
8

Si prevede di utilizzare la sintassi ConnectionMultiplexer.Connect("server1:6379,server2:6379") con gli indirizzi: combinazione numero di porta di ciascun nodo in un gruppo di replica ElastiCache (in termini AWS).utilizzando StackExchange.Redis con ElastiCache

La libreria gestirà i nodi morti/non rispondenti, passando automaticamente i comandi ai nodi attivi?
La libreria rileva automaticamente un nodo che non è riuscito è ora nuovamente disponibile/nuovi nodi aggiunti al gruppo di replica?

+0

Ti stai riferendo alla libreria 'StackExchange.Redis'? – thepirat000

+0

Sì - [questo] (https://github.com/StackExchange/StackExchange.Redis) – nirw

risposta

2

Non ho familiarità con Elasticache, ma StackExchange.Redis ConnectionMultiplexer riproverà automaticamente in background se la connessione viene interrotta e scoprirà i nodi recuperati.

Ovviamente, in caso di errori si ottengono eccezioni quando si accede al database, ma se si trattano gli errori correttamente non sarà necessario ricreare lo ConnectionMultiplexer.

ho usato il seguente codice di testare questo in cluster modalità standalone e-mode:

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; 

ho ricevuto tre tipi di eccezioni alla chiusura/sbattere i diversi server: RedisServerException, RedisConnectionException e TimeoutException . E ha smesso di ricevere eccezioni una volta che il server/cluster è attivo e di nuovo in esecuzione.

+0

Nel caso in cui la richiesta provi un nodo non attivo, tenterà di inviare la richiesta agli altri nodi noti o di generare un'eccezione ? – nirw

+0

Penso che dipenderà dal momento in cui il server va giù. Probabilmente otterrai una RedisServerException MOVED se il cluster si sta ripristinando, oppure CLUSTERDOWN non è stato in grado di ripristinare il cluster. In nessun caso è necessario ricreare il multiplexer. – thepirat000