【问题标题】:IO and CPU Bound calls with Async APIController in a Four layers application在四层应用程序中使用 Async APIController 进行 IO 和 CPU 绑定调用
【发布时间】:2015-05-11 21:29:14
【问题描述】:

我有一个四层应用程序:

  1. HTML UI 层对 UI 服务 (Web APIController) 进行 AJAX 调用。
  2. UI 服务,它是一个 Web API 控制器。 UI 服务调用应用服务。
  3. App Service 层,其中包含通过 EF 直接调用数据库以及调用其他域服务 (Web API) 的方法。
  4. 域服务,它们也是 Web API。

第一层、第二层和第三层托管在一台机器上。域服务托管在不同的机器上。 SQL Server 托管在不同的服务器上。

我的问题是:

  1. 如何区分 CPU 限制和 IO 限制调用?从 UI 服务到应用服务的调用是否因存在于同一个应用域中而受 CPU 限制

  2. 应用服务对域服务的调用是否IO Bound因为调用是通过网络进行的?应用服务对数据库的调用是否也是这种情况?

  3. 我应该让所有基于 TASK 的方法都使用 async/await 以利用可伸缩性吗?我所说的可扩展性是指HTML UI 层、UI Service 和 App Service 托管的 IIS 可以处理更多请求吗?

  4. 如果我没有异步 APIController,在网站流量大的情况下会发生什么?某些用户会因为 IIS 无法处理许多请求而收到 404 吗?

  5. 如果我有一个异步 APIController,在网站流量大的情况下会发生什么?由于 IIS 可以处理所有请求但它们都在排队,所以所有用户都会看到 UI,尽管有点晚了?

【问题讨论】:

    标签: iis asp.net-web-api io cpu scalability


    【解决方案1】:
    1. 网络上的调用是 IO 绑定到调用者的。被调用方存在什么样的边界取决于实现。
    2. 是的。
    3. “可以处理更多请求”如果您同时处理的请求数量(在同一时间点)超过 100 个,您可能开始看到异步的好处。在此之前,吞吐量收益为负数(更多 CU 负载)并且生产力成本不小。
    4. 请求排队并且产生越来越多的线程。这可能导致死亡。您可以解决此问题的情况是有限的。您可能没有 100 个并发请求,因为这可能会使您的服务器超载 10 倍。服务器上异步的主要情况是缓慢的后端服务(如 Web 服务或 Azure 的东西)。
    5. 只有当应用程序能够处理负载时,所有响应才会到达。这是很合乎逻辑的。如果线程池(如果配置正确)无法处理所有未完成的工作,异步只会为您提供更多吞吐量。几乎从来没有这种情况。

    关于何时使用 async 的讨论我之前的帖子:https://stackoverflow.com/a/25087273/122718https://stackoverflow.com/a/12796711/122718Does async calling of web service make sense on server?

    【讨论】:

    • (1) 我从您的回答中了解到,如果我的应用程序中的所有四个层都位于没有外部网络调用的单台机器上,那么使用异步 APIController 没有任何好处。 (2)为了澄清问题4的答案,让我换个方式问。如果 IIS 已设置为处理 10 个线程并且正在使用异步 APIController,则将仅使用 10 个线程处理任意数量的请求(100、200、300 或更多),并且不会创建或可能不会创建更多线程与同步 APIController 一样大,因此与同步 APIController 相比性能会更好。
    • (1) 不完全。即使网络是 CPU 模拟的,仍然有一个线程在等待远程方响应。您可以选择是否使用异步解除阻塞该线程。 (4) 假设 IIS 不会使用超过 10 个线程,那么是的,您可以通过使用异步“作弊”,因为这会将线程返回到池中。我不知道最近的 ASP.NET 版本用于线程管理。数字高得离谱。唯一实际的问题是喷射率,当爆发发生时,这可能是一个问题。通过将 mintheads 设置为较高的值来缓解。
    • 我现在明白了,通过异步,我明确告诉应用程序保存线程并在必要时将其用于传入请求。
    猜你喜欢
    • 2013-01-31
    • 2016-12-28
    • 2018-03-29
    • 1970-01-01
    • 2017-03-18
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多