У меня есть следующий асинхронный метод на контроллере MVC, работающем в приложении на IIS:
public async Task<ActionResult> GetStatus(Record record)
{
string key = $"status:{record.Key}";
Record cached = MemoryCache.Default.Get(key) as Record;
if (cached == null)
{
using (var client = new MyWebService.MyWebServiceClient())
{
var info = await client.GetStuffAsync(record.Foo);
record.Bar = info.Bar;
}
MemoryCache.Default.Set(key, record, new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(15) });
}
else
{
record = cached;
}
return this.Json(record, JsonRequestBehavior.AllowGet);
}
Метод вызывается через AJAX из браузера клиента. Браузер будет отправлять множество (~ 100) запросов одновременно и обрабатывать каждый ответ по мере его поступления.
Я заметил, что, похоже, количество одновременных запросов ограничивается примерно пятью. Однако я озадачен тем, что узким местом, по-видимому, является IIS, отвечающий на запросы, а не веб-служба.
Например, если я сделаю следующее:
MemoryCache
) отправьте кучу запросов, скажем, для ключей «A1», «A2», ..., «A100». Каждый запрос загружается примерно за пять секунд, что вполне ожидаемо, поскольку client.GetStuffAsync
занимает примерно столько же времени. Похоже, что запросы возвращаются группами по пять штук за раз.Этот последний сценарий и поставил меня в тупик. Я бы подумал, что await
в веб-сервисе позволит IIS тем временем переключаться на другие запросы. Я согласен с тем, что долго работающая веб-служба является узким местом, но сейчас похоже, что IIS ставит в очередь другие запросы, даже когда он ожидает в веб-службе.
Спасибо, @mjwills; узким местом было ограничение одновременного подключения браузера. Надо было подумать об этом ...
никто бы не стал использовать IIS, если он может обрабатывать только 5 одновременных запросов. Если я правильно помню, размер пула потоков IIS составляет 100 * # ядер. И если вы используете async, это будет 5k одновременных запросов.
На какой ОС работает IIS? Все ли 100 запросов поступают из одного и того же браузера (какой браузер вы используете)?