将 Redis 与 SignalR 一起使用

Posted

技术标签:

【中文标题】将 Redis 与 SignalR 一起使用【英文标题】:Using Redis with SignalR 【发布时间】:2016-07-09 18:22:48 【问题描述】:

我有一个在服务器 A 上运行的 ASP.NET MVC 应用程序和一些在服务器 B 上运行的 Web 服务。我已经实现了在服务器 A 上使用 SignalR 的实时通知。但是现在我需要服务器 B还能够向从服务器 A(主 Web 应用程序)提供的视图发送消息。因此,我正在尝试使用教程here 来涉及 Redis 背板。

在服务器 A 的启动中,我添加了以下内容:

GlobalHost.DependencyResolver.UseRedis("localhost", 6379, string.Empty, "abc");
app.MapHubs();

在这里,我假设“myApp”表示频道,当我在 Redis 控制台上运行 publish abc "hello world" 时,我可以看到订阅者计数返回为 1,但我无法弄清楚 SignalR 集线器如何与这个频道。我在哪里可以在服务器/视图上收到消息?我们可以只订阅一个 redis 频道吗?我们不能动态配置订阅特定频道吗?

编辑:如果我订阅abc,我可以在 redis 控制台上看到使用 SignalR 实现的聊天应用程序发送的消息。

另外,现在我已经在服务器 A 上实现了我自己的 redis 监听器,它在从 redis 通道接收消息时调用 signalR 集线器函数。我确信一定有不同的方法可以做到这一点,我希望 redis 背板可以帮助我,但不确定它是如何工作的。

【问题讨论】:

一个简单的解决方案。在服务器 B 上的所需频道上发布消息。订阅服务器 A 上的频道并手动将消息推送到 signalR 集线器。 这听起来可能很愚蠢,但它可以帮助我清楚地理解。这是否意味着要查看的每条消息只能通过服务器 A 发送,而不能直接通过服务器 B 发送?那么signalR.redis在这里有什么用呢? 请检查这个:- gigi.nullneuron.net/gigilabs/… 也在下面:- asp.net/signalr/overview/performance/scaleout-with-redis 【参考方案1】:

背板在服务器之间分发消息。

GlobalHost.DependencyResolver.UseRedis("localhost", 6379, string.Empty, "abc");

这里,abc是redis通道,也就是说无论哪个服务器通过这个通道连接到redis服务器,它们都会共享消息。 SignalR 通道(组)与 Redis 通道不同。您还可以共享 SignalR 频道(组)消息。

然后只需将Microsoft.AspNet.SignalR.Redis NuGet 安装到您的服务器。

像这样将你的服务器连接到 Redis:

 GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName");
 app.MapSignalR();

然后,像以前一样使用信号器。您无需执行任何其他操作。

Server A 向客户端发送消息时,会先将消息发送给 Redis。然后 Redis 将与所有订阅者(服务器 A 和 B)共享消息。然后,A 和 B 将消息发送给他们的客户。 (反之亦然,如果B发送消息也是如此)。

假设 A 向客户端发送消息。 _context.Clients.All.TestMessage("Hello");

这将首先发送到 redis,redis 将与 A 和 B 共享。

那么 A 和 B 都会将此消息发送给他们的客户。

_context.Clients.All.TestMessage("Hello");

但您不必担心这些事情。我之前说过。安装包,将你的服务器连接到 redis 并像以前一样使用 signalr。

如果我们提出您的问题。答案是肯定的。服务器 B 可以通过 Signalr Backplane 向服务器 A 客户端发送消息。

这张图片总结了我所说的:

【讨论】:

感谢您的详细解释!我可以在这里说我们不能动态订阅/取消订阅 redis 频道,而是在服务器 A 和 B 中使用全局频道并使用这些频道上的所有消息? 首先,Redis Channel 和 Signalr Channel 是不同的东西。其次,在映射 signalr 之后,您不能动态更改 redis 通道(为什么要更改?)。您可以动态使用的 Signalr 通道(组)。如果服务器 B 向一个组(通道)发送消息,连接到该组(通道)的服务器 A 客户端将收到此消息。 您可以询问您是否有问题,如果它回答了您的问题,则接受此作为答案

以上是关于将 Redis 与 SignalR 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

SignalR OnConnected 与多台服务器和 Redis 背板

ASP.NET Framework 4.6.2 SignalR 和 Redis 背板未连接

SignalR 可以与任何数据库一起使用吗? [关闭]

signalR的集群与负载均衡

SignalR 与 Service Fabric 无状态 Web API

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 之 用 Redis 实现用户在线离线状态消息处理