【发布时间】:2014-08-13 12:26:53
【问题描述】:
我刚刚继承了一个 MVC4 API 应用程序,它充当其他一些服务的基本请求转发器。应用的基本结构是这样的:
[请求] -> [rest api] -> [本地处理] -> [同步调用外部服务] -> [本地处理响应] -> [响应]
本地处理主要是关于验证内容并将其保存到数据库中。一点都不重。在极端情况下,外部请求可能需要 1 到 200 多秒的时间。 API 通常每小时处理数千个请求。
该应用托管在单个小型 Azure 云实例上。
我对线程感到困惑。从 API 处理程序方法到外部调用外部服务的整个过程都设置为异步:
public async Task<CustomResponseType> Post([FromBody] inputType) {
// some validation
...
// save some stuff to a db
...
var response = await httpClient.PostAsync(someRequest)
return await response.Content.ReadAsStringAsync();
}
首先,让这个过程异步有什么好处?据我了解,IIS 应该为传入的请求管理自己的线程池,并且由于我们正在等待对单个外部服务调用的同步响应,因此看起来实际上并没有并行处理任何事情。乍一看,异步服务请求似乎会争夺 IIS 将使用的相同资源,而且实际上同步执行所有操作可能更有效。
我已阅读此内容:http://msdn.microsoft.com/en-us/library/ee728598%28v=vs.98%29.aspx?wa=wsignin1.0 并了解在 IIS 端可能存在所谓的“线程饥饿”。那篇文章支持异步在这种情况下可能会有所帮助的想法,但我很难理解为什么。只增加 IIS 线程的数量会更容易吗?他们不是都在争夺相同的资源吗? IIS线程使用较重的问题是什么?
【问题讨论】:
-
最后我看到了服务器上异步的一个很好的例子。我在 Stack Overflow 上看到的大多数异步 IO 情况根本没有好处。很高兴你质疑这个设计决定!
标签: c# .net asp.net-mvc-4 asynchronous async-await