在Azure中进行Applicatoin_Start,Init和水平缩放

时间:2018-07-24 15:38:55

标签: azure appdomain horizontal-scaling httpapplication

Azure中的水平缩放方面的术语尚不清楚。

当它创建一个应用程序的多个实例时,我知道它们在单独的VM中运行,因此,当发生这种水平扩展时,这应该会导致创建带有自己的静态变量集的全新AppDomain。

如果是这种情况,那么每个实例都将调用Application_Start事件吗?

我们具有“缓存刷新”功能,该功能涉及设置侦听器以订阅消息队列中的“主题”,以便在接收到消息时刷新静态缓存。我们曾经认为我们必须在HttpApplication.Init事件中设置侦听器,该事件将为每个实例调用,但在意识到AppDomain中的所有HttpApplication实例共享同一组静态变量后,这不再有意义。

我的新理解是,即使没有水平扩展,Web应用程序中也会出现多个HttpApplication实例(因此会多次调用HttpApplication.Init)。换句话说,这是asp.net Web应用程序如何即使在单个AppDomain中也处理请求的正常功能。 Azure的水平扩展完全不同,涉及实例化完全独立的AppDomain。听起来不错吗?

1 个答案:

答案 0 :(得分:0)

根据您的描述,首先,我们需要了解以下两点:

  1. Application_Start仅在创建第一个HttpApplication对象并且随后创建的HttpApplication个实例不会触发此事件之后调用。

  2. 每个HttpApplication实例将创建一组新的HttpModule,并在创建后调用Init方法。

我们可以检查原始代码以了解如何创建HttpApplication

enter image description here

我们可以在System.Web.HttpApplicationFactory.GetNormalApplicationInstance

找到以上代码

因此,在单个AppDomain中,如果在进行并发访问时没有足够的HttpApplication实例,则将创建新的HttpApplication实例,并在创建每个实例后调用HttpApplication.Init。但是Application_Start仅在创建第一个HttpApplication实例之后被调用一次。

根据以上描述,我认为您应该在Application_Start事件中设置侦听器。当发生水平缩放时,每次创建新的AppDomain后都会调用Application_Start