5

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

AsyncController 可以用于服务大量不活动的并发请求吗?

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

4

2 回答 2

6

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

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

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

这是MSDN 上的一篇非常好的文章,它解释了 ASP.NET 中的异步请求。

这是一篇博文,说明了如何使用异步控制器来实现长轮询。

于 2011-02-13T09:01:12.447 回答
3

我最近根据Clay Lenhart 的一篇很棒的文章编写了一个使用 MVC 3 异步控制器的长轮询聊天服务器的简单示例,但我还没有机会用一堆连接对其进行真正的测试。

您可以在我根据 BitBucket 项目的源设置的 AppHarbor 部署中使用该示例。

此外,我的博客文章中提供了更多信息,解释了该项目。

于 2011-04-13T14:30:51.977 回答