Jus*_*mes 4 c# ajax asp.net-mvc signalr
我有一个ASP.NET MVC3应用程序.
如果我的应用程序有大量用户 - 假设为100,000 - 假设,如果所有用户互相交谈并且我使用了SignalR,那么是否会有100,000个长轮询连接?这会导致某种拒绝服务吗?
我应该使用AJAX HTTP吗?或者SignalR是否足够聪明,在一段时间内没有找到任何活动时会释放与资源池的连接?
何时使用signalR进行聊天建议聊天与AJAX?
您可以非常轻松地在Windows服务器上禁用所有DoS攻击保护.但是,这不一定能解决您的问题.100,000个连接将需要多个服务器用于这样的事情.
您的第一个限制是,每个IP地址,您只有大约65,000个可能的tcp端口来服务连接(65,535但更少的保留端口等,四舍五入).因此,您需要一台具有多个IP地址的大型服务器(可能不可靠且系统/应用程序中存在单点故障),或者您需要在某种负载均衡器后面安装多个服务器.
此外,通过长轮询,当每个长轮询连接结束并启动一个新轮询时,您会看到连接的一致"翻转".TCP端口不会立即重用,而是最快的可配置TCP定时等待延迟为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上进行一些多服务器负载均衡测试.亚马逊云服务提供了一个很好的粘性负载均衡器,可以轻松复制服务器以进行测试.在"实验室条件"(专用服务器没有做其他事情)我们可以在亚马逊的"大型实例"上超过20k客户端,这是一个7.5GB内存的四核服务器.
它还值得指出,使用最新的Server/IIS/Websync,您将获得WebSockets支持,这将有助于减少端口周转和重用,因为每个客户端可以维护到Web服务器的单个持久套接字连接.这可能会增加每台服务器的客户端数量.因此,根据websocket兼容浏览器/客户端的采用率,您可以从7服务器群集下载到4-5台服务器.(基于Web浏览器的JavaScript客户端的采用率不高,iPhone或Android设备等本机设备都将支持websocket,因此您可以立即看到全部优势).如果客户端不支持Web套接字,WebSync将从WebSockets故障回复到Long Polling.