node.js - NodeJS上的预热请求导致损坏?
问题描述
我有一个使用自定义域以 App Engine 标准运行的节点服务器。一切正常。
当我部署新版本时,会出现巨大的延迟峰值,因为旧实例停止并启动新实例。
通过阅读文档,我似乎需要:
- 通过添加到 app.yaml inbound_services 来启用预热请求:
- 暖身
- 为 /_ah/warmup 创建一个处理程序
- 部署新版本而不升级:gcloud deploy --no-promote app.yaml
- 在 App Engine 版本页面中,使用 Migrate 将流量从旧版本转移到新版本
我是 App Engine 的新手,文档含糊不清,所以我有疑问和一个主要问题:
- /_ah/warmup 处理程序的意义何在?由于我在节点应用程序启动时初始化了我需要的所有内容,因此该处理程序无需执行任何操作。
- 处理程序是可选的吗?我认为是的,因为我在某处读到 404 响应就可以了。
如果它不是可选的,预计会有什么反应?
这是大人物!:
我试过这个(省略处理程序)。迁移按钮变为可用并且似乎将流量迁移到新版本但是,过了一会儿我的网站开始出现故障。每次迁移后问题都不同 - 一次是损坏/无效的 HTML,另一次是 JavaScript 语法错误,另一次是整个站点被包裹在我没有编写的 HTML 的 PRE 标记中!我发现“修复”损坏的唯一方法是从 app.yaml 中删除 inbound_services: -warmup 并重新部署
更奇怪的是,只有从自定义域访问该站点时才会发生损坏。如果我点击appspot.com 地址一切正常
相同的代码已经在传统的 Web 服务器上运行了一年多。
我头疼。感激地收到任何帮助/见解
解决方案
预热请求通常不涉及新版本部署方案(但是,如果您当时的实时流量级别太高而无法由单个实例处理,它们可能会涉及)。它们仅在您已经有至少一个正在运行的实例并且需要启动新实例以处理传入流量增加时才涉及(与正在运行的实例具有相同的版本!) - 没有实时流量将被定向到新实例,直到它们成功处理了预热请求,从而表明它们已准备好处理真实的用户请求。
是的,预热请求是可选的。当动态扩展启动额外的实例来处理流量增加时,不使用预热请求会导致延迟增加。但是,如果您决定不使用它们,请确保您也不要启用预热入站服务。换句话说,您列表中的措施 1 和 2 属于一起,您要么执行两者,要么不执行。
执行 1 没有 2可能会导致部署期间出现一些中断:如果 GAE 决定在流量迁移期间启动多个实例,它可能会向某些实例发送预热请求,这些请求将失败,因为没有预热处理程序,导致 GAE 声明实例不健康并试图重新启动它们。您可以查看开发人员控制台上的Instances屏幕,选择新部署的服务版本和Instances图,并查找Created和Active数字来检查这个理论。但即使得到证实,我不确定此类事件是否可以解释您描述的症状。
只有列表中的措施 3 和 4 与减少新版本部署期间的延迟相关。通常使用这些步骤时应该没有流量损失,当然前提是新版本没有故障。至少理论是这样的。
推荐阅读
- angular - 为什么你想让你的 Angular 应用离线工作?
- python - Tkinter 文件对话框,传递文件路径并运行脚本的其余部分,转换为 .app
- java - MockMvc 空响应/返回
- angular8 - 如何在 Angular 8 中使用手机号码登录实现 Firebase?
- sqlite - 如果第一个选项卡在本地数据库中以反应原生方式插入数据,如何更新第二个选项卡?
- django - 如何将对象包含到类别或子类别中?
- excel - 使用 dic.MailMerge 循环不会保存我的文档。它会启动但不会停止,除非我将其关闭
- typescript - 尝试使用括号表示法访问对象属性时出现 Typescript 错误 TS1003
- jenkins - 端口地址已在使用:绑定
- selenium-webdriver - Cucumber Extent Report - 如何为每个黄瓜步骤添加屏幕截图