Параллельные вызовы Ajax вместо последовательных (но не при вызове с localhost)

Вопрос или проблема

Я запускаю WCF сервис на IIS. Сервис использует “webHttpBinding” и

<security mode="Transport">
   <transport clientCredentialType="Windows" />
</security>

После этого я делаю несколько ajax вызовов из моего веб-приложения.

  1. запрос, который занимает очень много времени
  2. несколько коротких запросов каждые 1 секунду для обновления статуса

Я запускаю своё приложение на http://localhost, и всё работает отлично. Но когда я запускаю своё приложение на сервере по https://dev.server.com, запросы отправляются на сервер, но им приходится ждать, пока не завершится первый очень долгий запрос. Это приводит к очень долгим временам “ожидания ответа сервера” в коротких запросах.

Как такое может быть? Я имею в виду, что это тот же сервис и те же запросы – почему localhost работает параллельно, а с dev-сервера – последовательно?

Ответ или решение

Ваша проблема, вероятно, связана с ограничениями параллельных подключений, установленными на уровне сервера или конкретно в приложении с использованием WCF и IIS. При работе на localhost к веб-сервису могут использоваться различные настройки, которые отличаются от тех, что применяются в продакшн-среде. Ниже я опишу несколько возможных причин и решений вашей проблемы.

Причины проблемы:

  1. Ограничения на количество одновременных подключений: В IIS по умолчанию может быть разрешено ограниченное количество одновременных подключений для одного и того же клиента. Во время выполнения длительного запроса другие запросы могут блокироваться, пока этот запрос не будет завершен.

  2. Проблемы с конфигурацией WCF: Конфигурации serviceThrottling могут ограничивать количество одновременных запросов к сервису, что может мешать выполнению других коротких запросов во время ожидания ответа на длинный запрос.

  3. Синхронное выполнение: Если ваши AJAX-запросы выполняются синхронно, это может привести к блокировке остальных запросов. Убедитесь, что все ваши AJAX-запросы отправляются асинхронно.

Решения:

  1. Настройка WCF для повышения производительности:
    Проверьте и измените настройки serviceThrottling в файле конфигурации WCF. Например, добавьте или измените следующий элемент:

    <behaviors>
     <serviceBehaviors>
       <behavior>
         <serviceThrottling maxConcurrentCalls="100" maxConcurrentSessions="100" maxConcurrentInstances="100" />
       </behavior>
     </serviceBehaviors>
    </behaviors>
  2. Установка максимального количества соединений в клиенте:
    Убедитесь, что вы не ограничены в количестве соединений по умолчанию для ваших AJAX-запросов. Для браузеров есть ограничение на количество параллельных соединений к одному домену. Наиболее часто используется 6 соединений. Убедитесь, что ваши запросы действительно отправляются параллельно.

  3. Использование Asynchronous Programming Model (APM):
    Если ваш WCF сервис поддерживает асинхронные операции, убедитесь, что вы используете асинхронные методы и правильно обрабатываете их на стороне клиента.

  4. Фоновая обработка запросов:
    Если у вас есть длинные запросы, рассмотрите возможность их обработки в фоновом режиме (например, с использованием очередей) и отправки статуса выполнения через другие более короткие запросы.

  5. Тестирование с другим сервером:
    Попробуйте протестировать на другом сервере (не локальном), чтобы определить, возникает ли аналогичная ситуация. Это поможет сузить причину проблемы.

  6. Профилирование и мониторинг:
    Используйте инструменты профилирования и мониторинга, чтобы определить, где возникают задержки. Это может помочь выяснить, какие запросы блокируют другие и почему.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...