Applicatoin_Start, Init и горизонтальное масштабирование в Azure
Терминология немного неясна в отношении горизонтального масштабирования в Azure.
Когда он создает несколько экземпляров приложения, я понимаю, что они запускаются в разных виртуальных машинах, поэтому, когда происходит такое горизонтальное масштабирование, это должно привести к созданию совершенно новых доменов приложений с их собственным набором статических переменных.
Если это так, то верно ли, что событие Application_Start будет вызываться для каждого экземпляра?
У нас есть функция очистки кэша, которая включает в себя настройку слушателя для подписки на "тему" в очереди сообщений, чтобы он очищал статический кэш при получении сообщения. Раньше мы думали, что должны были настроить прослушиватель в событии HttpApplication.Init, которое будет вызываться для каждого экземпляра, но это больше не имеет смысла после того, как мы осознали, что все экземпляры HttpApplication в AppDomain совместно используют один и тот же набор статических переменных.
Мое новое понимание состоит в том, что в веб-приложении будет происходить несколько экземпляров HttpApplication (и, следовательно, несколько вызовов HttpApplication.Init) даже без горизонтального масштабирования. Другими словами, это нормальная функция того, как веб-приложение asp.net обрабатывает запросы даже в одном домене приложений. Горизонтальное масштабирование Azure совершенно другое и включает создание совершенно отдельных доменов приложений. Это звучит правильно?
1 ответ
Согласно вашему описанию, во-первых, нам нужно знать ниже два момента:
Application_Start
будет вызываться только после первогоHttpApplication
объект создан и последующийHttpApplication
созданные экземпляры не вызывают это событие.каждый
HttpApplication
Экземпляр создаст новый наборHttpModule
и вызвать метод Init после его создания.
Мы можем проверить оригинальный код, чтобы увидеть, как HttpApplication
создано:
Мы можем найти выше код на System.Web.HttpApplicationFactory.GetNormalApplicationInstance
Так что в одном AppDomain, если не хватает экземпляров HttpApplication
при одновременном доступе, новый HttpApplication
экземпляры будут созданы и HttpApplication.Init
будет вызываться после каждого созданного экземпляра. Но Application_Start
вызываться только один раз после первого HttpApplication
экземпляр создан.
В соответствии с приведенным выше описанием, я думаю, вы должны настроить слушателя в Application_Start
событие. Когда происходит горизонтальный масштаб, Application_Start
будет вызываться каждый раз после создания нового домена приложений.