0

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

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

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

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

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

4

1 回答 1

0

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

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

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

我们可以查看原始代码,看看HttpApplication是如何创建的:

在此处输入图像描述

我们可以在上面找到代码System.Web.HttpApplicationFactory.GetNormalApplicationInstance

HttpApplication所以在单个 AppDomain 中,如果并发访问时没有足够的实例,则会HttpApplication创建新的实例,并HttpApplication.Init在每个实例创建后调用。但仅在创建第一个实例Application_Start后调用一次。HttpApplication

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

于 2018-07-27T06:44:51.690 回答