什么时候你真的需要在Web框架上异步?

时间:2013-08-01 05:17:58

标签: c# asp.net .net async-await nancy

Async已成为.net中的流行语,MS已在Web API 2中引入它,以便可以处理更多请求,而其他请求则等待IO完成。

虽然我可以看到这样做的好处,但这真的是一个问题吗? x64架构在线程池中有30000多个线程,所以除非您的网站上有很多并发用户真的需要异步?即使你有很多没有缓存的并发用户,我也很确定SQL Server会因为那么多请求而崩溃?

除了真正需要在Web框架上进行异步路由之外它还有光泽吗?

5 个答案:

答案 0 :(得分:9)

此处的许多其他答案都来自UI(桌面/移动应用)视角,而非Web服务器视角。

  

Async已成为.net中的流行词,MS已在Web API 2中引入它,以便可以处理更多请求,而其他请求则等待IO完成。

.NET 4.5 / VS 2012中引入了

asyncawait。但是,很久以前,ASP.NET自.NET 2.0以来就具有异步请求功能。并且有人使用它。

asyncawait带来的是易于维护的异步代码

  

虽然我可以看到这样做的好处,但它真的是一个问题吗?

async在服务器上的主要优点是可扩展性。简而言之,async任务比线程更好地扩展。

<@>约书亚的评论是关于记忆的关键;一个线程需要大量的内存(并且不要忘记无法被分页的内核模式堆栈),而async请求实际上只需要几百个字节。

还有一些需要考虑的问题。 .NET线程池具有有限的注入速率,因此除非您将minWorkerThread计数设置为远高于通常需要的值,否则当您获得突发流量时,一些请求将会在.NET启动之前达到503线程来处理它们。 async使您的线程保持自由(尽可能多),以便更好地处理突发流量。

  

x64架构在线程池中有30000多个线程,所以除非你的网站上有那么多并发用户真的需要异步吗?

当@Joshua指出您可能正在考虑请求队列限制(IIS队列默认为1000而ASP.NET请求限制为5000)时,@ Joshua再次正确。重要的是要注意,一旦填充此队列(在突发流量期间),新请求将被503拒绝。

  

即使你有很多没有缓存的并发用户,我也很确定SQL Server会因为那么多请求而崩溃?

啊,现在完全是另一个问题。

我在async服务器上专门提供talk at ThatConference 2013。谈话的一部分是async没有帮助的情况(my Twitter update)。

有一个excellent blog post here,它取得了异步数据库调用不值得努力的地位。重要的是要注意这篇文章中的假设:

  1. 在编写帖子时,异步Web服务器很难。这些天我们有async,越来越多的库提供异步API(例如,实体框架)。
  2. 该体系结构假定单个Web服务器具有单个SQL Server后端。传统上这是一种非常常见的设置,但今天正在迅速改变。
  3. async服务器真正发挥作用的地方是你的后端也可以扩展。例如,一个Web服务,Azure SQL,NoSQL集群等。示例:我正在编写一个MVC / WebAPI服务器,它使用Azure SQL和Storage作为其后端(出于所有实际目的,我可以表现得像它们具有无限的可伸缩性);在那种情况下,我将创建我的服务器async。在这种情况下,您可以使用async将服务器扩展10倍或更多。

    但是如果您只有一个SQL Server后端(并且没有计划更改为Azure SQL),那么制作您的Web服务器async是没有意义的,因为您无论如何都受到后端的限制。 / p>

答案 1 :(得分:4)

  1. 可以并行有效执行长操作。例如,您必须执行两个SQL并加载三个图片 - 将所有五个操作作为异步执行并等待它们全部。在这种情况下,总时间将是五次操作的最长持续时间,但不是持续时间的总和
  2. 预取。如果您可以预测(很有可能)用户会做什么(例如,几乎可以肯定,他会想要查看详细信息......),您可以在用户阅读前一页时开始准备下一页(框架,窗口)。

答案 2 :(得分:1)

你从哪里得到30000。我不记得确切,但我认为Asp.net使用12 x核心线程。

答案 3 :(得分:0)

我必须使用异步,当操作时间过长(上传,导出,处理)时,用户必须知道进度。

答案 4 :(得分:-2)

在以下场景中需要异步

1)当您执行非常长的操作并且您不想冻结UI时。

2)当你设计一些需要在后台完成的任务时。

例如,您正在从数据库渲染图像。但是你不希望你的页面在那时被冻结,因为异步非常有帮助。