1

我们正在开发作为 Azure Web 应用程序托管的 ASP.Net 核心。

我们还使用 Azure SignalR 服务

只要我们有 Web App 的单个实例,一切都很好,但是一旦我们将其扩展,我们就会遇到以下问题:

  1. 从 Controller 的操作中,我们解析 IHubContext 并将消息发送到 Hub 的客户端。到目前为止一切都很好
  2. Hub 的客户端接受响应并将其发送到 TheHub 端点。

这里的问题是响应可能被发送到 Web App 的另一个实例。所以我们从实例 #1 发送请求,但响应以 50% 的机会发送到实例 #2,而实例 #1 永远不会收到响应

关于我们如何使它工作的任何想法,例如发出的请求实际上收到了响应?

4

3 回答 3

1

SignalR 支持开箱即用的横向扩展方案,称为背板。这个想法是,在背板组件之一的帮助下,它将在所有实例中传播 SignalR 事件。对于 Asp.Net 框架,使用这些包之一

  • Microsoft.AspNet.SignalR.ServiceBus3
  • Microsoft.AspNet.SignalR.ServiceBus
  • Microsoft.AspNet.SignalR.StackExchangeRedis
  • Microsoft.AspNet.SignalR.SqlServer

对于 ASP.Net Core,只有 Redis 是随Microsoft.AspNetCore.SignalR.StackExchangeRedis包移植的,但也有一些由社区提供,请参阅https://github.com/thomaslevesque/AspNetCore.SignalR.AzureServiceBus

于 2019-12-24T12:23:37.183 回答
1
public void ConfigureServices(IServiceCollection services)
        {
            services.AddSignalR()
                    .AddAzureSignalR(options =>
                    {
                        options.ApplicationName = "app1";
                    }
                );
        }

您可以在服务器 SDK 中为不同的服务器组指定 ApplicationName。

它将帮助您的服务器在协商期间生成访问令牌,例如......?hub=app1_<your_hub>,这可以帮助我们的 ASRS 实例区分来自不同服务器组的连接

于 2021-03-09T21:25:57.570 回答
0

不幸的是,我没有找到不需要笨拙的解决方法的可靠解决方案

但是我可以为这种情况提供两种解决方案

  1. @LexLi 提出了解决此问题的好方法。因此,您基本上可以将您的 Web 应用程序也设为 SignalR 客户端,并使其成为组的成员。这样,Web 应用程序的每个实例也是一个客户端,然后接收 Hub 客户端响应的实例可以将此响应传递给 Web 应用程序实例组

  2. 您可以利用 Azure 服务总线主题。所以一旦启动实例将开始订阅收听一个主题。然后,一旦任何实例收到来自 Hub 客户端的响应,它就会将响应放入 Service Bus 主题中,然后每个实例都会收到来自该主题的响应

我希望可以有更好的解决方案来解决此类问题

于 2019-03-04T20:50:46.287 回答