2017-01-16 11 views
3

基本的に、私は"DON'T DO THIS"センチネルのシナリオを持っています。センチネルは、このようなシナリオでは安全ではないので、私は .Configure(ライター)(ConnectionMultiplexerとしてSRC)を呼び出すことで、私のメインの接続がダウンしている場合は、次のStackExchange.Redis - 実行時に構成を変更するにはどうすればよいですか?

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"); 
     } 
    } 
}; 

だから、私は設定を変更実装しましたこれにより、ConnectionMultiplexerは新しい構成を使用できます。ただし、ConnectionMultiplexerは引き続き古いものを使用します。

質問:ConnectionFailedイベントでConnectionMultiplexer.configurationを変更するにはどうすればよいですか。それが受け入れられるかどう

答えて

0

わからない、ではない正確に設定を切り替えるが、より多くのように、私は図書館のsource code見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

最も明白な答えですが、アプリ全体に広がっているため同じインスタンスを保持する必要があります。たぶんイベントがすべての加入者に通知することができるかもしれませんが、私のアプリケーションのいくつかは、ConnectionMultiplexerの参照を含む元の動作を変更することはできません。とにかくありがとうございました。 –

+0

私はあなたのコメントを期待していました。私は同様のことをやろうとしています。アプリケーションがMultiplixerではなくデータベースへのポインタを持っていなければならないと思っており、私はこのリファクタリングに取り組んでいます...安全な再設定と再接続でどこかに行けば、私は共有します。接続文字列に両方のホストを持っていて、maultiplixerが接続に失敗したシナリオを処理できるかどうかを確認しましたか? –

+0

私は両方の接続を設定すると、私は複数のマスターの問題に終わるでしょう。そのような場合、StackExchange.redisはTieBreakerという概念を使用して「メイン」マスターを解決します。そのような機能が問題を安全に解決できるかどうかはわかりません。私は月曜日に確認します。 –

2

を再構築し、何の目的の機能が存在しないようです。内部メソッドReconfigureがありますが、構成から他のサーバーに接続しようとします。

あなたのアプリケーションがそれほど大きくない場合は、リファクタリングすることをお勧めします。 ConnectionMultiplexer上にラッパーを作成し、接続が使用されるオブジェクトにラッパーを渡します。 1つのオブジェクトのすべてのリンクを返すGetConnectionメソッドをラップします。接続を必要とするすべての人がこのメソッドを呼び出し、接続を保存する必要はありません。ラッパーの内部OnFailedは、イベントハンドラを購読して、バックアップへの新しい接続を作成します。

関連する問題