2017-01-16 2 views
3

Grundsätzlich habe ich eine "DON'T DO THIS" Sentinel-Szenario. Da Sentinel nicht sicher in einem solchen Szenario ist, habe ich folgendesStackExchange.Redis - Wie kann ich die Konfiguration zur Laufzeit ändern?

var main = "192.168.XXX.YY:6379,abortConnect=false"; 
var backup = "192.168.XXX.YY:6379,abortConnect=false"; 

IConnectionMultiplexer redis = ConnectionMultiplexer.Connect(main); 

redis.ConnectionFailed += (src, args) => 
{ 
    if ((src as ConnectionMultiplexer).Configuration != backup) { 
     using (var writer = new StringWriter()) { 
      writer.Write(backup); 

      (src as ConnectionMultiplexer).Configure(writer); 
      /** 
       * Just for checking. It does not save 
       **/ 
      (src as ConnectionMultiplexer).GetDatabase().StringSet("aaa", "bbb"); 
     } 
    } 
}; 

So implementiert, wenn meine Hauptverbindung nach unten ist, ich die Konfiguration ändern, durch den Aufruf (src als ConnectionMultiplexer) .Configure (Drehbuch) , damit ConnectionMultiplexer die neue Konfiguration verwenden kann. ConnectionMultiplexer verwendet jedoch weiterhin den alten.

Frage: Wie kann ich ConnectionMultiplexer.configuration im ConnectionFailed-Ereignis ändern?

Antwort

0

nicht sicher, ob das akzeptabel wäre, nicht genau die Config Schalt sondern eher wie den Wiederaufbau der multiplixer

private static Lazy<IConnectionMultiplexer> _redisMux = new Lazy<ConnectionMultiplexer>(CreateMultiplexer); 
public static IConnectionMultiplexer Multiplexer { get { return _redisMux.Value; } } 

private const string Main = "192.168.XXX.YY:6379,abortConnect=false"; 
private const string Backup = "192.168.XXX.YY:6379,abortConnect=false"; 

private static string ActiveConfig = Main; 

private static ConnectionMultiplexer CreateMultiplexer() 
{ 
    var mux = ConnectionMultiplexer.Connect(ActiveConfig)); 
    mux.ConnectionFailed += OnConnectionFailed; 

    return mux; 
} 

[MethodImpl(MethodImplOptions.Synchronized)] 
private static void OnConnectionFailed(object sender, ConnectionFailedEventArgs e) 
{ 
    ActiveConfig = Backup; 

    try { Multiplexer.Dispose(); } catch { } 
    _redisMux = new Lazy<ConnectionMultiplexer>(CreateMultiplexer); 
} 
+0

Die offensichtlichste Antwort, aber ich muss die gleiche Instanz behalten, weil es über die ganze App verteilt ist. Vielleicht könnte ein Ereignis alle Abonnenten benachrichtigen, aber einige Teile meiner App können ihr ursprüngliches Verhalten nicht ändern, einschließlich der Referenz des ConnectionMultiplexer. Trotzdem danke. –

+0

Ich habe irgendwie deinen Kommentar erwartet .. Ich versuche etwas Ähnliches zu tun und ich komme zu einem Punkt, wo ich denke, dass die App einen Zeiger auf die Datenbank haben sollte, nicht auf den Multiplizierer und ich arbeite an diesem Refactoring ... Wenn ich irgendwo mit der sicheren Rekonfiguration komme und wieder verbinde, werde ich teilen .. Frage aber, hast du versucht, beide Hosts in der Verbindungszeichenfolge zu haben und zu sehen, ob der maultiplixer mit dem Szenario fehlgeschlagene Verbindung umgehen kann? –

+0

Wenn ich beide Verbindungen einstelle, werde ich am Ende von mehreren Mastern landen. In diesem Fall verwendet StackExchange.redis das Konzept von TieBreaker, um den "Haupt" -Master aufzulösen. Ich bin mir nicht sicher, ob eine solche Funktionalität mein Problem sicher lösen kann. Ich werde am Montag nachsehen. –

2

ich am source code der Bibliothek sah, scheint es dort nicht die gewünschte Funktionalität ist. Es gibt eine interne Methode Reconfigure, aber es versucht, sich von der Konfiguration aus mit anderen Servern zu verbinden.

Ich würde vorschlagen, Sie zu refaktorieren, wenn Ihre Anwendung nicht sehr groß ist. Erstellen Sie einen Wrapper über ConnectionMultiplexer, übergeben Sie Wrapper an Objekte, bei denen die Verbindung verwendet wird. Wir haben die Methode GetConnection implementiert, die alle Links auf ein einzelnes Objekt zurückgibt. Alle, die die Verbindung benötigen, rufen diese Methode auf, keine Notwendigkeit, die Verbindung zu speichern. Innerhalb des Wrappers abonniert OnFailed einen Event-Handler, um eine neue Verbindung zu einem Backup zu erstellen.

Verwandte Themen