我有一个 ASP.NET MVC3 应用程序。
如果我的应用程序有大量用户——比如说 100,000——假设,如果所有用户都在互相交谈并且我使用 SignalR,那么会有 100,000 个长轮询连接吗?这些会导致某种拒绝服务吗?
我应该改用 AJAX HTTP 吗?或者 SignalR 是否足够聪明,可以在一段时间内没有发现任何活动时释放与资源池的连接?
什么时候推荐使用 signalR 进行聊天而不是 AJAX?
我有一个 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 个连接也是不现实的,我将一半用于端口重用。然后,您需要考虑到达该服务器的网页、rest api 或其他静态资源的任何其他 http 请求。然后考虑处理器/内存必须为保存/格式化数据进行的任何其他处理。所以我会进一步减少一半。我会说每台服务器有 15,000 个客户端是一个现实的最大值。因此,对于 100,000 个用户,您在负载平衡集群中可能至少需要 7 台服务器。
最后我检查了 SignalR 在这样的多服务器环境中不起作用。同样,AJAX 或任何其他“频繁刷新”方法将在可用 tcp 端口/套接字等的数量方面受到类似的物理限制。您不能在一台服务器上以高频率的 http 请求服务 100,000 个客户端。
我已经使用 Amazon EC2 上的多个服务器使用WebSync for ASP.net对此类大规模负载进行了大量测试。我在 FrozenMountain 工作,去年我的工作之一是在 Amazon EC2 Cloud 上进行一些多服务器负载平衡测试。亚马逊云服务提供了一个很好的粘性负载均衡器,并且可以轻松复制您的服务器以进行测试。在“实验室条件”(专用服务器不做其他事情)中,我们可以在亚马逊的“大型实例”上超过 20k 个客户端,这是一个具有 7.5gb 内存的四核服务器。
Its also worth pointing out that with the latest Server/IIS/Websync you get WebSockets support which will help reduce the port turnover and reuse as each client can maintain a single persistent socket connection to the web server. That can potentially increase your client count per server. So you might be able to go from a 7 server cluster down to maybe 4-5 servers depending on the adoption rate of websocket compatible browsers/clients. (Web browser based JavaScript clients won't have a high adoption rate, native devices like iPhones or Android devices will all have websocket support, so you'll see the full benefits right away). WebSync will fail back from WebSockets to Long Polling if the client doesn't support web sockets.