SignalR用于大用户群的聊天

时间:2012-12-22 20:40:21

标签: c# ajax asp.net-mvc signalr

我有一个ASP.NET MVC3应用程序。

如果我的应用程序有大量用户 - 假设为100,000 - 假设,如果所有用户互相交谈并且我使用了SignalR,那么会有100,000个长轮询连接吗?这会导致某种拒绝服务吗?

我应该使用AJAX HTTP吗?或者SignalR是否足够聪明,在一段时间内没有找到任何活动时会释放与资源池的连接?

什么时候建议使用signalR进行聊天,以便与AJAX进行聊天?

1 个答案:

答案 0 :(得分:5)

您可以非常轻松地在Windows服务器上禁用所有DoS攻击保护。但是,这不一定能解决您的问题。 100,000个连接将需要多个服务器用于这样的事情。

您的第一个限制是,根据IP地址,您只有大约65,000个可能的tcp端口用于服务连接(65,535但保留端口较少,等等四舍五入)。因此,您需要一台具有多个IP地址的大型服务器(可能不可靠且系统/应用程序中存在单点故障),或者您需要在某种负载均衡器后面安装多台服务器。

同样通过长轮询,当每个长轮询连接结束并启动一个新轮询时,您会看到连接的一致“翻转”。 TCP端口不会立即重用,而是最快的可配置TCP timed wait delay为30秒。所以即使65,000连接也是不现实的,我只有一半用于端口重用。然后,您需要考虑到达该服务器的任何其他http请求,以获取网页,rest api或其他静态资源。然后考虑处理器/内存必须进行的任何其他处理以保存/格式化数据。所以我可能会进一步减少另外一半。我说每台服务器15,000个客户端是一个真实的最大值。因此,对于100,000个用户,您可能会在负载平衡群集中查看最少7台服务器。

最后我检查过SignalR在这样的多服务器环境中不起作用。同样,AJAX或任何其他“频繁刷新”方法将对可用的tcp端口/套接字的数量等遭受类似的物理限制。您无法在具有高频率的http请求的服务器上为100,000个客户端提供服务。

我在Amazon EC2上使用多个服务器使用WebSync for ASP.net进行了大量的大规模负载测试。我为FrozenMountain工作,去年我的一项工作是在Amazon EC2 Cloud上进行一些多服务器负载均衡测试。亚马逊云服务提供了一个很好的粘性负载均衡器,可以轻松复制服务器以进行测试。在“实验室条件”(专用服务器没有做其他事情)我们可以在Amazon's "large instance"上超过20k客户端,这是一个7.5GB内存的四核服务器。

还值得指出的是,使用最新的Server / IIS / Websync,您将获得WebSockets支持,这将有助于减少端口周转和重用,因为每个客户端都可以维护与Web服务器的单个持久套接字连接。这可能会增加每台服务器的客户端数量。因此,根据websocket兼容浏览器/客户端的采用率,您可以从7服务器群集下载到4-5台服务器。 (基于Web浏览器的JavaScript客户端的采用率不高,iPhone或Android设备等本机设备都将支持websocket,因此您可以立即看到全部优势)。如果客户端不支持Web套接字,WebSync将从WebSockets故障回复到Long Polling。