【问题标题】:SignalR - Switch between different Redis backplanesSignalR - 在不同的 Redis 背板之间切换
【发布时间】:2013-02-10 16:27:41
【问题描述】:

假设我们有 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 应用程序背板已更改连接到新应用程序的方式,以维持连接的客户端之间的通信?

【问题讨论】:

    标签: c# asp.net redis signalr


    【解决方案1】:

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

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

    【讨论】:

    • 这也适用于切换主控,但我再次找不到通知 SignalR 背板发生变化的方法。也许我需要“重新映射”集线器或其他东西,但我尝试的任何方法似乎都不起作用。
    猜你喜欢
    • 2017-01-12
    • 2021-07-13
    • 2019-11-28
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 2020-07-31
    相关资源
    最近更新 更多