Dav*_*d H 5 asp.net asp.net-mvc server-push long-polling asynccontroller
Node.js,Tornado和Twisted等框架允许开发人员创建支持大量并发挂起请求(10k +)的服务器推送应用程序.据我所知,他们都是通过不创建线程来为每个挂起请求提供服务来实现这一点.
AsyncController可用于服务大量非活动并发请求吗?
如果是这样,是否有任何相当大的ASP.NET MVC网站使用这种方法来创建长轮询应用程序?
在以下情况下,AsyncController非常有用(与普通控制器相比):
您有一个长时间运行的任务,此任务通常通过使用I/O完成端口由其他层(Web服务,数据库......)实现.所以请求从一个工作线程开始,然后你调用BeginXXX方法,它将打开一个IOCP(如果它支持它,如果它没用,因为它只会绘制另一个工作线程),工作线程将立即返回到线程池.在执行长操作期间,服务器上不会消耗工作线程.一旦完成它就向IOCP发出信号,异步控制器从池中抽取另一个线程来简单地终止请求并将结果返回给视图.这里有一些注意事项:你使用异步控制器而不是普通控制器的事实对客户端没有任何区别:他仍然需要等待相同的时间来完成请求,不要得到错误的印象,即异步控制器会使您的慢速运行更快.简单地说,工作线程将被垄断更少的时间,因此可能会使其他请求运行得更快.
总结一下:对于快速运行的请求,与普通控制器相比,异步控制器不会带来任何好处.对于慢速请求,它们可以但它将取决于长时间运行操作的性质以及它是CPU还是I/O限制.对于CPU绑定任务,异步控制器也不是更有用.但在所有情况下,您都应该对您的应用程序执行大量负载测试.
这是一篇关于MSDN的非常好的文章,它解释了ASP.NET中的异步请求.
这是一篇博客文章,演示了如何使用异步控制器来实现长轮询.
我最近根据Clay Lenhart 的一篇精彩文章,使用 MVC 3 异步控制器编写了一个长轮询聊天服务器的简单示例,但我还没有机会使用大量连接来真正测试它。
您可以在我根据 BitBucket 项目的源代码设置的AppHarbor 部署上使用该示例。
另外,我的博客文章解释了该项目,提供了更多信息。