8

假设我们有 2 个 Redis 服务器背板,一个作为主服务器,另一个作为从服务器。

每个 Web 应用程序都在使用 SignalR,以便在发生时将内容推送到连接的客户端,并将它们连接到我在 Application_Start 中使用的背板

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

现在,如果 Master Redis Backplane 出现故障,我想将 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);
    }
}

这似乎可以完成工作。

您能否帮助我了解如何通知我的 Web 应用程序背板已更改连接到新应用程序的方式,以维持连接的客户端之间的通信?

4

1 回答 1

1

我们没有专门使用 SignalR ,但是我们在使用 redis 的方式上有一些非常相似的地方,尤其是在节点之间切换时。具体来说,我们使用 redis pub/sub 订阅一个频道,并在更改 master 时向该频道广播。

我们的配置有点不同,因为我们使用基于ConnectionUtils.Connect(...). 这意味着我们可以指定多个节点,并ConnectionUtils处理确定哪个是当前主节点的问题。但在您的情况下,您也许可以将新的主信息作为发布/订阅的一部分发布。我还应该注意,处理切换主机(带有通知)的大部分代码都包含在ConnectionUtils.SwitchMaster. 这包括更改广播,您可以通过 订阅ConnectionUtils.SubscribeToMasterSwitch。作为一个次要的实现细节,它使用的通道是"__Booksleeve_MasterChanged"- 但如果你只使用公共方法,那是不透明的。

于 2013-02-25T14:17:23.430 回答