我将创建一个无状态,可伸缩的Web应用程序。这是我的第二天性而不是问题。
但是,这个将使用SignalR,因此将建立与每个用户的WebSocket连接。
想象一下,我的Web应用程序扩展到5个不同的Web服务器,处理来自5000个并发用户的负载。这些用户将建立WebSocket连接,即使负载均衡器确保负载在5个Web服务器之间分配,每个用户也将连接到一个特定的Web服务器。
现在问题来了。如果发生事件并且我想将此事件发送给我的某个连接用户,我该怎么做?
用户可以连接到任何Web服务器,所以我想我要么需要一些数据库来跟踪哪些用户连接到哪个Web服务器?或者我需要将所有消息发送到所有Web服务器,如果他已连接,它会将消息传递给用户?
后者似乎不具备可扩展性。第一个似乎是我必须做的事情,除非这里的某个人能告诉我一个最佳实践方法来应对这一挑战。
答案 0 :(得分:5)
您需要在您的应用程序中引入所谓的背板。背板基本上是应用程序中的一个额外消息层,它与SignalR集成并处理serverfarm的分布式特性。
目前,您可以使用多种技术,我建议您看一下Redis,我已经设法在具有良好性能特征的大型项目中使用它:
https://docs.microsoft.com/en-us/aspnet/signalr/overview/performance/scaleout-with-redis