【问题标题】:How much async/await is OK? [closed]多少异步/等待是可以的? [关闭]
【发布时间】:2014-11-18 16:45:42
【问题描述】:

在我们的项目中,我们将 async/await 用于几乎 3 个目的(针对所有方法):

  1. 数据访问层:获取/更新数据库的位置(使用 Dapper)。
  2. 缓存(Redis):读/写。
  3. ASP.Net MVC 5 控制器。

问题是多少异步/等待是可以的。即使在读取或写入少量数据时也可以使用它们吗?缓存和控制器呢?

备注:这个项目有点特别,一天的几个小时可能有大约每秒50,000个请求

【问题讨论】:

  • 一根绳子有多长?如果没有看到您编写的任何代码并且至少对您的服务器环境有所了解,就不可能回答这个问题。您是否仅将async/await 用于 IO?您在应该使用的地方使用ConfigureAwait(false) 吗?你做过分析和压力测试吗? 你特别关注哪一段代码
  • 我们确实设置了一些负载测试,模拟了大约 10,000 个用户,并看到了 IIS8 中排队的项目,即使对于简单的场景也是如此。

标签: c# asp.net-mvc asynchronous async-await


【解决方案1】:

根据我读过的一篇文章:

Async/await 非常适合在潜在的情况下避免阻塞 在 .NET 应用程序中执行耗时的工作,但也有 与运行异步方法相关的开销

当异步时,这样做的成本相对可以忽略不计 工作需要很长时间,但值得牢记。

根据您的问题,即使读取或写入少量数据?。这似乎不是一个好主意,因为已经结束了。

这里是文章:The overhead of async/await in NET 4.5

并且在文章中他使用了 profiler 来检查 async/await 的优化。

引用:

尽管这种异步方法相对简单,但 ANTS 性能 Profiler 显示它导致超过 900 个框架方法被运行 为了初始化它和它第一次做的工作 它运行了。

这里的问题可能是您是否要接受这些最低限度的间接费用,并考虑到这些间接费用确实会堆积成可能有问题的东西。

【讨论】:

  • 请记住,在服务器场景中,您仍应强烈考虑使用 async 进行 I/O,这本质上是不可预测的。大多数异步分析测试假设后端是 100% 响应的,因此它们实际上只是在测量异步开销。我希望看到一个测试来衡量这一点,然后另一个测试使用 1% 的后端超时失败率 - 然后看看 async 是如何叠加的。
【解决方案2】:

问题是多少异步/等待是可以的。甚至可以使用它们吗 读取或写入少量数据时?缓存和怎么样 控制器?

您应该将 async/await 用于 I/O 绑定操作,如果是少量数据也没关系。更重要的是避免可能长时间运行的 I/O 绑定操作,主要是磁盘和网络调用。 Asp.net 的线程池大小有限,这些操作可能会阻塞它。使用异步调用有助于您的应用程序更好地扩展并允许处理更多并发请求。

欲了解更多信息:http://msdn.microsoft.com/en-us/magazine/dn802603.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-11
    • 2021-12-20
    • 2014-11-23
    • 2020-01-03
    • 2015-12-04
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    相关资源
    最近更新 更多