Applicatoin_Start, Init и горизонтальное масштабирование в Azure

Терминология немного неясна в отношении горизонтального масштабирования в Azure.

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

Если это так, то верно ли, что событие Application_Start будет вызываться для каждого экземпляра?

У нас есть функция очистки кэша, которая включает в себя настройку слушателя для подписки на "тему" ​​в очереди сообщений, чтобы он очищал статический кэш при получении сообщения. Раньше мы думали, что должны были настроить прослушиватель в событии HttpApplication.Init, которое будет вызываться для каждого экземпляра, но это больше не имеет смысла после того, как мы осознали, что все экземпляры HttpApplication в AppDomain совместно используют один и тот же набор статических переменных.

Мое новое понимание состоит в том, что в веб-приложении будет происходить несколько экземпляров HttpApplication (и, следовательно, несколько вызовов HttpApplication.Init) даже без горизонтального масштабирования. Другими словами, это нормальная функция того, как веб-приложение asp.net обрабатывает запросы даже в одном домене приложений. Горизонтальное масштабирование Azure совершенно другое и включает создание совершенно отдельных доменов приложений. Это звучит правильно?

1 ответ

Согласно вашему описанию, во-первых, нам нужно знать ниже два момента:

  1. Application_Start будет вызываться только после первого HttpApplication объект создан и последующий HttpApplication созданные экземпляры не вызывают это событие.

  2. каждый HttpApplication Экземпляр создаст новый набор HttpModule и вызвать метод Init после его создания.

Мы можем проверить оригинальный код, чтобы увидеть, как HttpApplication создано:

Мы можем найти выше код на System.Web.HttpApplicationFactory.GetNormalApplicationInstance

Так что в одном AppDomain, если не хватает экземпляров HttpApplication при одновременном доступе, новый HttpApplication экземпляры будут созданы и HttpApplication.Init будет вызываться после каждого созданного экземпляра. Но Application_Start вызываться только один раз после первого HttpApplication экземпляр создан.

В соответствии с приведенным выше описанием, я думаю, вы должны настроить слушателя в Application_Start событие. Когда происходит горизонтальный масштаб, Application_Start будет вызываться каждый раз после создания нового домена приложений.

Другие вопросы по тегам