无状态可伸缩Web应用程序中SignalR(WebSockets)连接的体系结构

时间:2018-01-28 16:13:03

标签: c# asp.net .net azure signalr

我将创建一个无状态,可伸缩的Web应用程序。这是我的第二天性而不是问题。

但是,这个将使用SignalR,因此将建立与每个用户的WebSocket连接。

想象一下,我的Web应用程序扩展到5个不同的Web服务器,处理来自5000个并发用户的负载。这些用户将建立WebSocket连接,即使负载均衡器确保负载在5个Web服务器之间分配,每个用户也将连接到一个特定的Web服务器。

现在问题来了。如果发生事件并且我想将此事件发送给我的某个连接用户,我该怎么做?

用户可以连接到任何Web服务器,所以我想我要么需要一些数据库来跟踪哪些用户连接到哪个Web服务器?或者我需要将所有消息发送到所有Web服务器,如果他已连接,它会将消息传递给用户?

后者似乎不具备可扩展性。第一个似乎是我必须做的事情,除非这里的某个人能告诉我一个最佳实践方法来应对这一挑战。

1 个答案:

答案 0 :(得分:5)

您需要在您的应用程序中引入所谓的背板。背板基本上是应用程序中的一个额外消息层,它与SignalR集成并处理serverfarm的分布式特性。

目前,您可以使用多种技术,我建议您看一下Redis,我已经设法在具有良好性能特征的大型项目中使用它:

https://docs.microsoft.com/en-us/aspnet/signalr/overview/performance/scaleout-with-redis