具有多个实例的Azure SignalR和Azure Web应用程序

时间:2019-03-02 14:44:02

标签: asp.net-core azure-web-app-service azure-signalr

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

我们还使用Azure SignalR服务

只要我们拥有Web应用程序的单个实例,一切都可以正常工作,但是一旦将其扩展,我们就会遇到以下问题:

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

这里的问题是响应可能发送到Web App的另一个实例。因此,我们从实例1发送请求,但响应以50%的机会发送到实例2,实例1从未收到响应

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

但是对于这种情况我可以提供2种解决方案

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

  2. 您可以利用Azure Service Bus主题。因此,一旦启动实例将开始订阅以收听主题。然后,任何实例从集线器的客户端收到响应后,它将响应放入“服务总线主题”中,然后每个实例将从主题接收此响应

我希望可以为这种问题找到更好的解决方案

答案 2 :(得分:0)

public void ConfigureServices(IServiceCollection services)
        {
            services.AddSignalR()
                    .AddAzureSignalR(options =>
                    {
                        options.ApplicationName = "app1";
                    }
                );
        }

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

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