如何防止 azure 在准备好之前扩展其他实例?
how to prevent azure from scaling out additional instances until they are ready?
我们的 Azure 应用程序服务有问题。我们的一项网络服务 (MVC) 在启动时从数据库缓存数据 (Application_Start) - 这大约需要 3 分钟。在准备就绪之前,我们无法处理请求。
这是已知的,因此我们将其设置为 'always on',并且旨在仅在必要时在非高峰时段重新启动它。
但是,我们预计下个月服务器的负载会很重,并且在我们对自动缩放的测试中,我们发现当它添加额外的实例时,这些实例中的每一个都会经历相同的启动延迟 - 但是流量在当前 运行 实例和正在预热的新实例之间分配,例如在那 3 分钟内,一半的请求开始失败。
我们如何配置 Azure 以延迟使用新实例,直到它准备好? (或者我们应该改用 AWS 等吗?)。
一些文档指出使用自定义负载平衡器探测器,但它主要讨论 VM,而我们使用的是 PAAS。
您可以在 Azure 中使用经典 VM 以外的其他资源类型(如应用服务)执行此操作。应用服务通过共享相同内存池和线程池的实例进行扩展和缩减。
其中一条评论中包含的 link https://www.jan-v.nl/post/warming-up-your-app-service 中有很多有用的信息。
根据该信息,您需要的功能在免费套餐中不可用。
我会以不同的方式处理这个问题。为什么从数据库加载数据需要 3 分钟?由于它仅在启动时加载,因此应该是不经常更改的数据。
你能:
- 优化从数据库中读取数据?
- 减少从数据库读取的数据量?
- 将数据导出到文件,并从文件中读取?
我的建议是使用带有运行状况探测的 Azure 负载均衡器
请尝试减少需要在 app_start 上加载的数据,并尝试在第一次请求时将数据延迟加载到缓存中。有时,即使在完成所有这些操作之后,我们最终也会得到开始时所需的大量数据。
我们有两种方法可以解决这个问题。
第一,假设您正在使用内存缓存并且应用程序的每个实例都需要在 App_Start 上补充其内存缓存。尝试使用像 Azure Cache for Redis 这样的外部缓存提供程序,您的新实例可以直接指向此外部缓存而无需重新加载数据。
二、可以依赖Application Initialization Module which was introduced in IIS 7.5 (installed on Azure App Services' IIS). To use this feature, you need to add applicationInitialization
section under web.server
section of web.config. This will help you not make the instance available until the warm-up process is completed. More info on how to use ApplicationInitialization is available in this blog post
最好的情况是结合使用两者,applicationInitialization
将指向您的应用程序中的一个页面,该页面检查外部缓存是否可用和水合,如果是,则完成,否则水合外部缓存缓存。
我们的 Azure 应用程序服务有问题。我们的一项网络服务 (MVC) 在启动时从数据库缓存数据 (Application_Start) - 这大约需要 3 分钟。在准备就绪之前,我们无法处理请求。
这是已知的,因此我们将其设置为 'always on',并且旨在仅在必要时在非高峰时段重新启动它。
但是,我们预计下个月服务器的负载会很重,并且在我们对自动缩放的测试中,我们发现当它添加额外的实例时,这些实例中的每一个都会经历相同的启动延迟 - 但是流量在当前 运行 实例和正在预热的新实例之间分配,例如在那 3 分钟内,一半的请求开始失败。
我们如何配置 Azure 以延迟使用新实例,直到它准备好? (或者我们应该改用 AWS 等吗?)。
一些文档指出使用自定义负载平衡器探测器,但它主要讨论 VM,而我们使用的是 PAAS。
您可以在 Azure 中使用经典 VM 以外的其他资源类型(如应用服务)执行此操作。应用服务通过共享相同内存池和线程池的实例进行扩展和缩减。
其中一条评论中包含的 link https://www.jan-v.nl/post/warming-up-your-app-service 中有很多有用的信息。
根据该信息,您需要的功能在免费套餐中不可用。
我会以不同的方式处理这个问题。为什么从数据库加载数据需要 3 分钟?由于它仅在启动时加载,因此应该是不经常更改的数据。
你能:
- 优化从数据库中读取数据?
- 减少从数据库读取的数据量?
- 将数据导出到文件,并从文件中读取?
我的建议是使用带有运行状况探测的 Azure 负载均衡器
请尝试减少需要在 app_start 上加载的数据,并尝试在第一次请求时将数据延迟加载到缓存中。有时,即使在完成所有这些操作之后,我们最终也会得到开始时所需的大量数据。
我们有两种方法可以解决这个问题。
第一,假设您正在使用内存缓存并且应用程序的每个实例都需要在 App_Start 上补充其内存缓存。尝试使用像 Azure Cache for Redis 这样的外部缓存提供程序,您的新实例可以直接指向此外部缓存而无需重新加载数据。
二、可以依赖Application Initialization Module which was introduced in IIS 7.5 (installed on Azure App Services' IIS). To use this feature, you need to add applicationInitialization
section under web.server
section of web.config. This will help you not make the instance available until the warm-up process is completed. More info on how to use ApplicationInitialization is available in this blog post
最好的情况是结合使用两者,applicationInitialization
将指向您的应用程序中的一个页面,该页面检查外部缓存是否可用和水合,如果是,则完成,否则水合外部缓存缓存。