Как выполнить несколько запросов одновременно на сервере IIS? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть страница, которая выполняет четыре асинхронных вызова ajax для четырех веб-сервисов (на сервере IIS) один за другим следующим образом:

executeAjax('/get_parent_List.asmx',blah, blah, blah, successCallBack,errorCallBack);
executeAjax('/get_file_list.asmx',blah, blah, blah, successCallBack2,errorCallBack2);
executeAjax('/get_assigned_to_list.asmx',blah, blah, blah, successCallBack3,errorCallBack3);
executeAjax('/get_comments_list.asmx',blah, blah, blah, successCallBack4,errorCallBack4);

Ниже приведен журнал со страницы сценария Java. Он включает отметку времени перед отправкой запроса и отметку времени после получения ответа на каждый запрос.

before GET_PARENT_LIST:::::::::::::: 17/05/2018 11:15:39.218
before GET_FILE_LIST:::::::::::::: 17/05/2018 11:15:39.220
before GET_ASSIGNED_TO_LIST:::::::::::::: 17/05/2018 11:15:39.222
before GET_COMMENTS_LIST:::::::::::::: 17/05/2018 11:15:39.224
response of GET_PARENT_LIST:::::::::::::: 17/05/2018 11:15:39.570
response of GET_FILE_LIST:::::::::::::: 17/05/2018 11:15:39.799 
response of GET_COMMENTS_LIST:::::::::::::: 17/05/2018 11:15:40.340
response of GET_ASSIGNED_TO_LIST:::::::::::::: 17/05/2018 11:15:40.797

Ниже приведен журнал от веб-сервисов:

start of GET_PARENT_LIST:::::::::: 17/05/2018 11:15:39.223
end of GET_PARENT_LIST:::::::::: 17/05/2018 11:15:39.564
start of GET_FILE_LIST:::::::::: 17/05/2018 11:15:39.733
end of GET_FILE_LIST:::::::::: 17/05/2018 11:15:39.791
start of GET_COMMENTS_LIST:::::::::: 17/05/2018 11:15:40.244
end of GET_COMMENTS_LIST:::::::::: 17/05/2018 11:15:40.336
start of GET_ASSIGNED_TO_LIST:::::::::: 17/05/2018 11:15:40.743
end of GET_ASSIGNED_TO_LIST:::::::::: 17/05/2018 11:15:40.793

Таким образом, у меня есть несколько запросов здесь:

  1. Обработка веб-службы для GET_PARENT_LIST была завершена 39.564 . Обработка следующего веб-сервиса (GET_FILE_LIST) началась в 39,733 . Почему требуется (733 - 564) 169 миллисекунд, чтобы начать обработку GET_FILE_LIST после того, как GET_PARENT_LIST завершил его выполнение, даже когда все четыре вызова ajax уже были запущены к моменту, когда первый GET_PARENT_LIST был завершен после его выполнения?

  2. Можно заметить, что веб-сервисы выполняются таким образом, что выполнение следующего веб-сервиса начинается только после того, как его предыдущий веб-сервис завершил выполнение. Можно ли запустить веб-службы таким образом, чтобы они запускали выполнение, как только они получают запрос от вызовов ajax?

    • Как видно из журналов javascript и веб-службы, вызов AJAX для GET_FILE_LIST был запущен 39.220 , но его выполнение в веб-службе началось только 39.791 . почти через 571 миллисекунд. Я хочу, чтобы выполнение веб-службы GET_FILE_LIST началось сразу после запуска запроса AJAX.

PS: я запускаю страницу и сервер на одном и том же порту локально. Таким образом, запрос не является кросс-браузерным и выполняется на локальном хосте.

1 Ответ

0 голосов
/ 17 мая 2018

IIS использует рабочие потоки.Каждый рабочий поток отвечает за выполнение запроса для каждого потока.Если все рабочие потоки заполнены, следующий запрос должен будет дождаться освобождения рабочего потока, прежде чем его можно будет обработать.

В вашем пуле приложений только один рабочий поток для IIS Express.Это означает, что он будет выполнять один синхронный вызов за раз.остальные запросы ставятся в очередь.

Обновлено - Не рекомендуется .Вы можете увеличить рабочие потоки, изменив applicationhost.config , расположенный в Documents \ IISExpress \ config \ applicationhost.config .

Поиск элемента applicationPools .

Измените следующее, добавив элемент processModel к элементу add , чтобы изменитьпул приложений для всех веб-приложений .NET 4:

<add name="Clr4IntegratedAppPool" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true">
    <processModel maxProcesses="10"/>
</add>

Измените атрибут maxProcesses в следующем элементе по умолчанию для пулов приложений, чтобы изменить каждый созданный впоследствии пул приложений (возможно, в этом нет необходимости).

<applicationPoolDefaults managedRuntimeLoader="v4.0" >
    <processModel maxProcesses="10" />
</applicationPoolDefaults>

Вам нужно будет перезапустить службу IIS Express, чтобы получить шанс вступить в силу.Это можно сделать, закрыв IIS на панели задач или перезапустив Visual Studio.

Предупреждение : изменение в файле конфигурации может привести к нестабильной работе IIS Express, так как вы изменяете посещаемый дизайнсервиса.

Чтобы сделать веб-сервис асинхронным, вам придется использовать асинхронный шаблон.При использовании асинхронного шаблона в веб-службе он способен обрабатывать до 30 000 запросов в секунду в каждом рабочем потоке.

...