c# - 无状态可扩展 Web 应用程序中 SignalR (WebSockets) 连接的架构

标签 c# asp.net .net azure signalr

我将制作一个无状态、可扩展的 Web 应用程序。这对我来说是第二天性,而不是问题。

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

假设我的 Web 应用程序扩展到 5 个不同的 Web 服务器,处理 5000 个并发用户的负载。这些用户将建立 WebSocket 连接,尽管负载均衡器将确保负载分布在 5 台 Web 服务器之间,但每个用户都将连接到一台特定的 Web 服务器。

现在问题来了。如果发生事件并且我想将此事件发送给我的一位已连接用户,我该如何执行此操作?

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

后者似乎不可扩展。第一个似乎是我必须做的,除非这里有人可以告诉我应对这一挑战的最佳实践方法。

最佳答案

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

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

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

关于c# - 无状态可扩展 Web 应用程序中 SignalR (WebSockets) 连接的架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48488428/

相关文章:

c# - 泛型方法的调用是不明确的错误

c# - 使用 Web 窗体的 ASP.NET 路由

c# - 从方法返回 List<T> 的性能是否与返回 Collection<T> 不同?

c# - 带有更新查询的 OleDbCommand 会导致 OleDbException

c# - 如何使用 jquery 或仅使用表单例份验证的 javascript 注销?

c# - 在单个操作中启用多个 HTTP 方法?

c# - 用户控件的结构体属性的代码生成

c# - 消除随机重复?

c# - Xamarin表格: How notify my previous viewmodel than is observable collection need to be modified?

c# - 在另一个上下文中引用身份用户