2013-02-25 8 views
5

Załóżmy, że mamy 2 Backplanes serwera Redis, jeden jako Master, a drugi jako Slave.SignalR - Przełącz między różnymi płaszczyznami Redis

Każda aplikacja internetowa korzysta SignalR aby przesunąć zawartość do podłączonych klientów, jak to się dzieje i aby podłączyć je do płyty montażowej używam w Application_Start

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

Teraz w przypadku Mistrza Redis płytka montażowa nie , Chciałbym promować serwer Slave Redis na Master i przełączać wszystkie istniejące połączenia z serwerów internetowych na nowy Master Redis Server.

W celu promowania serwera podrzędnego do Master I używam następujący kod

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

który wydaje się do pracy.

Czy możesz mi pomóc, w jaki sposób mogę poinformować moją aplikację internetową, że płyta montażowa zmieniła sposób połączenia z nowym, aby podtrzymać komunikację między moimi połączonymi klientami?

Odpowiedz

0

Nie używamy SignalR specyficznie, ale mamy coś bardzo podobnego w sposobie, w jaki używamy redis, szczególnie podczas przełączania między węzłami. W szczególności używamy redis pub/sub do subskrybowania kanału, a my nadajemy temu kanałowi podczas zmiany mastera.

Nasza konfiguracja jest inna niż mała, ponieważ używamy rozdzielonej wersji konfiguracyjnej opartej na numerze ConnectionUtils.Connect(...). Oznacza to, że możemy określić wiele węzłów, przy czym ConnectionUtils radzi sobie z problemami związanymi z określeniem, który jest bieżącym wzorcem. Ale w twoim przypadku możesz prawdopodobnie opublikować nowe informacje główne jako część pub/sub. Należy również zauważyć, że znaczna część kodu obsługującego przełączniki główne (z powiadomieniem) jest opakowana za ConnectionUtils.SwitchMaster. Obejmuje to transmisję zmiany, którą można subskrybować pod numerem ConnectionUtils.SubscribeToMasterSwitch. Jako niewielki szczegół implementacji, kanał, którego używa do tego, to "__Booksleeve_MasterChanged" - ale to jest nieprzejrzyste, jeśli używasz publicznych metod.

+0

To również działa, aby zmienić Master, ale znowu nie mogę znaleźć sposobu na poinformowanie SignalR, że nastąpiła zmiana w backplane. Może potrzebuję "remapować" Huby lub coś innego, ale cokolwiek próbowałem, nie działa. – ppolyzos

Powiązane problemy