У нас есть IIS7, работающий на нескольких узлах в кластере NLB. Узлы NLB настроены на Affinity: None, чтобы новые соединения распределялись по ним. Мы хотим, чтобы KeepAlive был включен, чтобы повысить производительность, но мы обнаруживаем, что, когда один из узлов в кластере уходит, весь его трафик переходит на другие узлы, но никогда не возвращается. Несмотря на то, что мы запускаем веб-сервисы, у нас есть только несколько клиентов, которые выполняют задачи с интенсивным использованием ЦП, поэтому мы обнаруживаем, что один сервер будет забит до смерти, а другой будет сидеть без дела!
Мы хотели бы что-то вроде Apache MaxKeepAliveRequests, который ограничивает количество запросов в данном соединении, чтобы IIS периодически заставлял клиентов повторно подключаться и, следовательно, балансировал кластер.
Это что-то поддерживает IIS7? Это то, что делают «нормальные» люди?
Я не смог найти подходящего решения, поэтому написал свое. Я задокументировал параметры конфигурации в IIS и NLB. В статье представлен код модуля HTTP, необходимый для реализации параметра MaxKeepAliveRequests, чтобы убедиться, что ни один клиент не привязан к тому же узлу в кластере NLB.
Балансировка подключений через NLB с использованием IIS и MaxKeepAliveRequests
Если это действительно сеанс без сохранения состояния, вы можете полностью отключить KeepAlive в IIS7 с помощью:
appcmd set config /section:httpProtocol /allowKeepAlive:false
Это не должно добавить значительных накладных расходов, если большая часть работы выполняется всего несколькими клиентами. Однако не забудьте сначала проверить это.