8

2 つの Redis サーバー バックプレーンがあり、1 つがマスター、もう 1 つがスレーブであるとします。

各 Web アプリケーションは SignalR を使用して、接続されたクライアントにコンテンツをプッシュし、Application_Start で使用しているバックプレーンにそれらを接続します。

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

ここで、マスター Redis バックプレーンに障害が発生した場合に備えて、スレーブ Redis サーバーをマスターに昇格させ、既存のすべての接続を Web サーバーから新しいマスター Redis サーバーに切り替えたいと考えています。

スレーブ サーバーをマスターに昇格させるために、次のコードを使用しています。

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 アプリケーションに通知する方法を教えてください。

4

1 に答える 1

1

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

に基づいて区切られた構成バージョンを使用するため、構成は少しConnectionUtils.Connect(...)異なります。ConnectionUtilsこれは、現在のマスターがどれであるかを把握するという問題を処理しながら、複数のノードを指定できることを意味します。しかし、あなたの場合、新しいマスター情報を pub/sub の一部として公開することができます。マスターの切り替え (通知あり) を処理するためのコードの多くは、ConnectionUtils.SwitchMaster. これには、 経由で購読できる変更のブロードキャストが含まれますConnectionUtils.SubscribeToMasterSwitch。マイナーな実装の詳細として、これに使用するチャネルは"__Booksleeve_MasterChanged"- しかし、パブリック メソッドを使用するだけでは不透明です。

于 2013-02-25T14:17:23.430 に答える