c# - SignalR - 在不同的 Redis 背板之间切换

标签 c# asp.net redis signalr

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

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

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

现在万一 Master Redis 背板出现故障,我想将 Slave Redis 服务器提升为主服务器并将所有现有连接从 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);
    }
}

这似乎可以完成工作。

你能帮我告诉我如何通知我的网络应用程序背板已经改变了如何连接到新的,以维持我连接的客户端之间的通信吗?

最佳答案

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

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

关于c# - SignalR - 在不同的 Redis 背板之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15068481/

相关文章:

redis - Redis从列表中弹出多个元素

python - celery 优先队列

asp.net - Moodle 和 Umbraco - MYSQL 异常

c# - 无法使用c#获取网站内容

c# - 在c# winform中选择DataGridView的一列值

c# - 通过 CSOM 记录版本历史

javascript - 如何在asp.net c#中使用javascript从ajax组合框中获取选定的值

asp.net - asp :button disappears in IE7, 但留在 IE8 中。为什么?

redis - 在 Airflow 的不同机器上运行一个 DAG 的多个任务

c# - C# 中是否有任何 CSV 读取器/写入器库?