我们正在开发作为Azure Web应用程序托管的ASP.Net核心。
我们还使用Azure SignalR服务
只要我们拥有Web应用程序的单个实例,一切都可以正常工作,但是一旦将其扩展,我们就会遇到以下问题:
这里的问题是响应可能发送到Web App的另一个实例。因此,我们从实例1发送请求,但响应以50%的机会发送到实例2,实例1从未收到响应
关于如何使它工作以使发出请求的实例实际收到响应的任何想法?
答案 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种解决方案
@LexLi建议了一种解决此问题的好方法。因此,您基本上可以将您的Web应用也设置为SignalR客户端,并使其成为组的成员。这样,每个Web应用程序实例也是一个客户端,然后接收到Hub客户端响应的实例可以将此响应传递给一组Web应用程序实例
您可以利用Azure Service Bus主题。因此,一旦启动实例将开始订阅以收听主题。然后,任何实例从集线器的客户端收到响应后,它将响应放入“服务总线主题”中,然后每个实例将从主题接收此响应
我希望可以为这种问题找到更好的解决方案
答案 2 :(得分:0)
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR()
.AddAzureSignalR(options =>
{
options.ApplicationName = "app1";
}
);
}
您可以在服务器 SDK 中为不同的服务器组指定一个 ApplicationName。
它将帮助您的服务器在协商期间生成诸如 ......?hub=app1_