【问题标题】:Applicatoin_Start, Init, and horizontal scaling in AzureAzure 中的 Applicatoin_Start、Init 和水平缩放
【发布时间】:2019-01-01 07:33:30
【问题描述】:

有关 Azure 中水平缩放的术语有点不清楚。

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

如果是这样,那么是否会为每个实例调用 Application_Start 事件?

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

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

【问题讨论】:

标签: azure appdomain horizontal-scaling httpapplication


【解决方案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事件中设置监听器。当发生横向缩放时,每次新建 AppDomain 后都会调用Application_Start

【讨论】:

    猜你喜欢
    • 2015-05-11
    • 2015-09-20
    • 2016-04-22
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    相关资源
    最近更新 更多