将 Redis 与 SignalR 结合使用

Using Redis with SignalR

我有一个 ASP.NET MVC 应用程序 运行 在服务器 A 上 运行 和一些 Web 服务 运行 在服务器 B 上。我已经实现了实时通知在服务器 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 集线器如何与通道交互。我在哪里可以收到 server/view 上的消息?我们可以只订阅一个redis频道吗?我们不能动态配置订阅特定频道吗?

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

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

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

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();

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

当服务器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 客户端发送消息。

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