2013-02-25 60 views
5

假設我們有2個Redis服務器背板,一個爲主設備,另一個爲從設備。SignalR - 在不同的Redis背板之間切換

每個Web應用程序,以便將內容推送到連接的客戶端,因爲它發生,爲了將它們連接到背板使用SignalR我正在使用的Application_Start

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

現在的情況下,主Redis的背板失敗,我想將Slave Redis服務器升級爲Master,並將所有現有連接從Web服務器切換到新的Master 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); 
    } 
} 

,似乎做的工作。

請問我可以通知我的網絡應用程序背板已更改如何連接到新的,以維持連接的客戶端之間的通信?

回答

0

我們不使用SignalR ,特別是,但我們在使用redis的方式上有些非常相似,特別是在節點間切換時。具體而言,我們使用redis pub/sub訂閱頻道,並在更改主頻道時向該頻道播放。

我們的配置是一個不同,因爲我們使用基於ConnectionUtils.Connect(...)的分隔配置版本。這意味着我們可以指定多個節點,用ConnectionUtils來處理確定哪個是當前主節點的問題。但在你的情況下,你可以發佈新的主信息作爲pub/sub的一部分。我還應該注意,處理交換主機的大部分代碼(包含通知)都包含在ConnectionUtils.SwitchMaster之後。這包括廣播變更,您可以通過ConnectionUtils.SubscribeToMasterSwitch訂閱。作爲次要實現細節,它用於此的頻道是"__Booksleeve_MasterChanged" - 但如果您只是使用公共方法,則這是不透明的。

+0

這也可以切換主控,但我再也找不到一種方法告知SignalR背板有變化。 也許我需要「重新映射」集線器或其他東西,但無論我嘗試似乎沒有工作。 – ppolyzos 2013-02-25 14:41:44