[英]Applicatoin_Start, Init, and horizontal scaling in Azure
关于Azure中的水平扩展,术语尚不清楚。
当它创建一个应用程序的多个实例时,我知道它们在单独的VM中运行,因此,当发生这种水平扩展时,这将导致创建带有自己的静态变量集的全新AppDomain。
如果是这样,那么是否为每个实例调用Application_Start事件是否正确?
我们具有“缓存刷新”功能,该功能涉及设置侦听器以订阅消息队列中的“主题”,以便在接收到消息时刷新静态缓存。 我们曾经认为我们必须在HttpApplication.Init事件中设置侦听器,该事件将为每个实例调用,但在意识到AppDomain中的所有HttpApplication实例共享同一组静态变量后,这不再有意义。
我的新理解是,即使没有水平扩展,Web应用程序中也会出现多个HttpApplication实例(因此会多次调用HttpApplication.Init)。 换句话说,这是asp.net Web应用程序如何即使在单个AppDomain中也处理请求的正常功能。 Azure的水平扩展完全不同,涉及实例化完全独立的AppDomain。 听起来对吗?
根据您的描述,首先,我们需要了解以下两点:
仅在创建第一个HttpApplication
对象并且随后创建的后续HttpApplication
实例不会触发此事件之后,才会调用Application_Start
。
每个HttpApplication
实例将创建一组新的HttpModule
并在创建后调用Init方法。
我们可以检查原始代码以了解如何创建HttpApplication
:
我们可以在System.Web.HttpApplicationFactory.GetNormalApplicationInstance
找到以上代码
因此,在单一的AppDomain中,如果没有足够的实例HttpApplication
当并发访问时,新HttpApplication
将创建实例和HttpApplication.Init
每个实例创建后就会被调用。 但是Application_Start
仅在创建第一个HttpApplication
实例之后被调用一次。
根据上面的描述,我认为您应该在Application_Start
事件中设置侦听器。 当发生水平缩放时,每次创建新的AppDomain后都会调用Application_Start
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.