ASP.NET MVC的AsyncController可用于服务大量并发挂起请求(长轮询)吗?

时间:2011-02-13 06:51:56

标签: asp.net asp.net-mvc long-polling server-push asynccontroller

Node.js,Tornado和Twisted等框架允许开发人员创建支持大量并发挂起请求(10k +)的服务器推送应用程序。据我所知,他们都是通过不创建线程来为每个挂起请求提供服务来实现这一目的。

可以使用AsyncController来处理大量非活动并发请求吗?

如果是这样,是否有任何相当大的ASP.NET MVC网站使用这种方法来创建长轮询应用程序?

2 个答案:

答案 0 :(得分:6)

在以下情况下,AsyncController非常有用(与普通控制器相比):

您有一个长时间运行的任务,此任务通常由其他层(Web服务,数据库,...)使用I/O Completion Ports实现。所以请求从一个工作线程开始,然后你调用BeginXXX方法,它将打开一个IOCP(如果它支持它,如果它没用,因为它只会绘制另一个工作线程),工作线程将立即返回到线程池。在执行长操作期间,服务器上不会消耗工作线程。一旦完成它就向IOCP发出信号,异步控制器从池中抽取另一个线程来简单地终止请求并将结果返回给视图。这里有一些注意事项:你使用异步控制器而不是普通控制器的事实对客户端没有任何区别:他仍然需要等待相同的时间来完成请求,不要得到错误的印象,即异步控制器会使您的慢速运行更快。简单地说,工作线程将被占用更少的时间,因此可能会使其他请求运行得更快。

总结:对于快速运行的请求,与普通控制器相比,异步控制器不会带来任何好处。对于慢速请求,它们可以但它将取决于长时间运行操作的性质以及它是CPU还是I / O限制。对于CPU绑定任务,异步控制器也不是更有用。但在所有情况下,您都应该对您的应用程序执行大量的负载测试。

这是一个very good article on MSDN,解释了ASP.NET中的异步请求。

这是一个blog post,它说明了如何使用异步控制器来实现长轮询。

答案 1 :(得分:3)

我最近使用基于simple example of a Long Polling Chat Server的MVC 3异步控制器编写了一个great article by Clay Lenhart,但我还没有机会用一堆连接来测试它。

您可以根据BitBucket项目的来源使用我设置的example on a AppHarbor deployment

此外,我的blog post explaining the project提供了更多信息。