Возможна ли принудительная инициализация процесса IIS Web-Garden? - PullRequest
3 голосов
/ 16 июня 2009

У нас есть веб-приложение ASP.Net, работающее в IIS Web-Garden, которое настроено на выделение до четырех процессов. В нашем веб-приложении первый пользователь, который заходит на сайт, вызывает загрузку всех кэшированных элементов. Поскольку мы работаем в IIS Web-Garden, в конечном счете, для создания кеша для каждого из четырех процессов Web-Garden в конечном итоге требуется до четырех пользователей. Это построение кэша занимает 30-40 секунд, мы пытались сделать его быстрее, но вряд ли это можно улучшить.

Это недопустимо, нам было поручено все время делать сайт быстрым для всех (не дожидаясь инициализации кэша). Я хотел бы использовать решение, которое сканирует сайт для предварительного нагрева кэша. Проблема в том, что функция Web-Garden выглядит как черный ящик - у вас нет возможности контролировать, когда / IIS решит загрузить этот 2-й, 3-й или 4-й процесс при попадании следующего HTTP-запроса.

Мне кажется, это обычная проблема, но поиск решения дал мало результатов. У меня вопрос, есть ли способ через HTTP-заголовки или какую-либо другую конструкцию дать подсказку IIS, которую вы хотели бы загрузить или, по крайней мере, направить на обработку 2,3,4 и т. Д.?

Ответы [ 3 ]

6 голосов
/ 17 июня 2009

По словам инженеров Microsoft, это невозможно с IIS 6. Однако они добавили новую функцию в IIS 7.5 и ASP.Net 4.0, в которой есть отличное условие для именно того, что я ищу здесь. Это называется "preloadProvider". Вот пример фрагмента ниже (очень круто!).

http://forums.iis.net/p/1158476/1907392.aspx

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

<sites>

  <site name="MySite" id="1">

    <application path="/"

         preloadEnabled="true"

         preloadProvider="PrewarmMyCache" >

        <!--  Additional content -->

    </application>

  </site>

</sites>



<!-- Additional content -->



<preloadProviders>

     <add name="PrewarmMyCache"

         type="MyNamespace.CustomInitialization, MyLibrary" />

</preloadProviders>

При холодном запуске сервера IIS 7.5 или при перезапуске отдельного пула приложений IIS 7.5 использует информацию в файле applicationHost.config, чтобы определить, какие веб-приложения должны запускаться автоматически. Для каждого приложения, помеченного для автозапуска, IIS7.5 отправляет запрос в ASP.NET 4.0, чтобы запустить приложение в состоянии, во время которого приложение временно не принимает запросы HTTP. Когда он находится в этом состоянии, ASP.NET создает экземпляр типа, определенного атрибутом preloadProvider (как показано в предыдущем примере), и вызывает его общедоступную точку входа. Вы создаете управляемый тип автозапуска с необходимой точкой входа, реализуя интерфейс IProcessHostPreloadClient, как показано в следующем примере:

public class CustomInitialization :  System.Web.Hosting.IProcessHostPreloadClient

{

    public void Preload(string[]  parameters)

    {

        // Perform initialization.

    }

}

После запуска кода инициализации в методе Preload и возврата метода приложение ASP.NET готово к обработке запросов. С добавлением автоматического запуска в IIS 7.5 и ASP.NET 4.0 теперь у вас есть четко определенный подход для выполнения дорогостоящей инициализации приложения перед обработкой первого HTTP-запроса. Например, вы можете использовать новую функцию автозапуска для инициализации приложения, а затем сообщить балансировщику нагрузки, что приложение было инициализировано и готово принять трафик HTTP.

2 голосов
/ 16 июня 2009

Возможно, используйте инструмент веб-мониторинга для периодического доступа к вашему веб-приложению. Помимо возможности отправлять вам электронное письмо / страницу, когда ваш сайт отключается или иным образом не ведет себя должным образом, такие инструменты могут иметь полезный побочный эффект - поддерживать ваше веб-приложение «горячим» в зависимости от того, какие страницы и на с какой частотой инструмент будет настроен для доступа к сайту.

Теоретически, IIS будет распределять входящие запросы по принципу циклического перебора между садами, как только они все будут инициализированы. Что может быть лучше всего, так это настроить инструмент мониторинга с различными URL-адресами в вашем приложении, которые не равны целому числу процессов в вашем саду - в противном случае одни и те же сады всегда будут поражены одним и тем же подмножеством URL, при условии отсутствия другой активности на сайте. В любом случае, если все настроено правильно, после нескольких раундов все ваши сады должны быть горячими.

0 голосов
/ 21 сентября 2012

Microsoft выпустила модуль, который делает именно то, что вы просите. Модуль инициализации приложения для IIS 7.5 решит вашу проблему, убедившись, что на каждом из серверов в вашем саду будут установлены горячие кэши и они будут реагировать, когда получат первую страницу от реального пользователя.

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

Более подробно вы можете прочитать мой ответ на аналогичный вопрос на Как прогреть приложение ASP.NET MVC на IIS 7.5?

...