2013-02-25 4 views
5

2つのRedis Server Backplane、つまりMasterとSlaveの2つがあるとします。SignalR - 異なるRedisバックプレーン間の切り替え

マスターRedisのバックプレーンに障害が発生した場合にはそれが起こると、私は今のApplication_Start

GlobalHost.DependencyResolver.UseRedis(host, port, "", new[] {"signalr.key"}); 
RouteTable.Routes.MapHubs(); 

に使用していますバックプレーンにそれらを接続するためにように、各Webアプリケーションは、接続されたクライアントにコンテンツをプッシュするために、SignalRを使用しています私は、スレーブ・レディス・サーバーをマスターに昇格させ、既存のすべての接続をウェブ・サーバーから新しいマスター・レディス・サーバーに切り替えたいと考えています。

マスターにスレーブサーバを促進するために、私は仕事をしているようだ次のコード

using (var conn = new RedisConnection(host, port, allowAdmin: true)) 
{ 
    if (conn.ServerType != ServerType.Master) 
    { 
     conn.Open(); 
     var makeMaster = conn.Server.MakeMaster(); 
     var info = conn.Wait(conn.GetInfo()); 
     conn.Wait(makeMaster); 
    } 
} 

を使用しています。

接続されたクライアント間の通信を維持するために、バックプレーンが新しいものに接続する方法を変更したことをWebアプリケーションに知らせる方法を教えてください。

答えて

0

SignalR 特には使用しませんが、特にノード間を切り替えるときに、赤目を使用する方法はかなり似ています。具体的には、redis pub/subを使用してチャネルをサブスクライブし、マスターを変更するときにそのチャネルにブロードキャストします。

私たちの設定はに基づいて区切られた設定バージョンを使用しているため、少しです。これは、複数のノードを指定できることを意味します。ConnectionUtilsは、現在のマスタがどれであるかを把握するための懸念を処理します。しかし、あなたのケースでは、おそらくパブ/サブの一部として新しいマスター情報を公開することができます。私は、通知マスタを扱うコードの多くがConnectionUtils.SwitchMasterの後ろに折り返されていることにも注意してください。これには、ConnectionUtils.SubscribeToMasterSwitchで登録できる変更のブロードキャストが含まれます。マイナーな実装の詳細として、これに使用するチャネルは"__Booksleeve_MasterChanged"ですが、パブリックメソッドを使用するだけでは不透明です。

+0

これはMasterを切り替えるためにも機能しますが、SignalRにバックプレーンに変更があったことを知らせる方法が見つけられません。 ハブなどを「再マップ」する必要があるかもしれませんが、試したものは動作していないようです。 – ppolyzos

関連する問題