【发布时间】:2017-02-22 22:30:26
【问题描述】:
正如此处各种其他相关问题中所述,我还期望在(重新)部署具有相当大的 EF6 模型和大量引用的 nuget 包的 Web 角色之后进行长时间(30 秒)的首次调用。在用preloadEnabled 和serviceAutoStartProviders 尝试了不同的建议解决方案后,我仍然感到困惑并决定重新打开这个话题,希望有人在此期间找到更好的解决方案。
我的主要目标是让 Web 角色在新部署中退出其忙碌状态并可由负载平衡器和外部客户端访问时,几乎与后续调用一样快地响应第一个请求。不幸的是,到目前为止,我在提出的解决方案中遇到了以下问题:
-
preloadEnabled:- 我确实通过
PKGMGR.EXE /iu:IIS-ApplicationInit在启动任务中添加了应用程序初始化模块。到目前为止,一切都很好。 - 当我尝试执行
%windir%\system32\inetsrv\appcmd set site "MySiteName" -applicationDefaults.preloadEnabled:true时,它会失败,因为在执行启动脚本时,在全新部署的 IIS 中仍然没有创建任何网站。 - 如果我尝试在我的
Application_Start方法中通过ServerManager-class 设置preloadEnabled-setting,我无法理解,在对网络角色进行第一次外部调用之前如何执行此代码,因为在新的 Web 角色部署后 preloadEnabled 设置默认为 false,因此我理解的 Application_Start 方法没有机会被应用程序初始化模块执行?
- 我确实通过
-
serviceAutostartProviders:- 在这里,我们需要在 applicationhost.config 中放置实现
IProcessHostPreloadClient接口的 AutostartProvider 的名称,即使用 appcmd 脚本或 ServerManager 类,但是:- serviceAutostartProvider 就像 preloadEnabled 一个与站点相关的设置,所以我们在这里遇到与 1.2 中的
%windir%\system32\inetsrv\appcmd set site "MySiteName" -applicationDefaults.preloadEnabled:true相同的问题 - 在全新部署后的启动脚本执行时,网站尚未在 IIS 中创建,脚本无法正确执行 - 另一种可能性是将 applicationhost.config 包含到部署包中,但我没有找到任何解决方案来为 Web 角色执行此操作。
- serviceAutostartProvider 就像 preloadEnabled 一个与站点相关的设置,所以我们在这里遇到与 1.2 中的
- 在这里,我们需要在 applicationhost.config 中放置实现
那么你们是如何设法确保预加载程序集和一些初始化代码(如填充内存缓存)在角色从外部首次受到攻击之前运行的?
我们现在开始获得一些流量并获得大约。我们的 WebApi 每秒有 1-2 个请求,因此在每次更新部署后预加载对客户端“可见”的 30 秒延迟现在已成为一个主要问题。
我们在低流量时间安排更新部署,但如果我需要进行紧急修补程序部署怎么办?
【问题讨论】:
标签: azure asp.net-web-api webrole warm-up