首页 > 解决方案 > NodeJS上的预热请求导致损坏?

问题描述

我有一个使用自定义域以 App Engine 标准运行的节点服务器。一切正常。

当我部署新版本时,会出现巨大的延迟峰值,因为旧实例停止并启动新实例。

通过阅读文档,我似乎需要:

  1. 通过添加到 app.yaml inbound_services 来启用预热请求:
    • 暖身
  2. 为 /_ah/warmup 创建一个处理程序
  3. 部署新版本而不升级:gcloud deploy --no-promote app.yaml
  4. 在 App Engine 版本页面中,使用 Migrate 将流量从旧版本转移到新版本

我是 App Engine 的新手,文档含糊不清,所以我有疑问和一个主要问题:

  1. /_ah/warmup 处理程序的意义何在?由于我在节点应用程序启动时初始化了我需要的所有内容,因此该处理程序无需执行任何操作。
  2. 处理程序是可选的吗?我认为是的,因为我在某处读到 404 响应就可以了。
  3. 如果它不是可选的,预计会有什么反应?

  4. 这是大人物!:

我试过这个(省略处理程序)。迁移按钮变为可用并且似乎将流量迁移到新版本但是,过了一会儿我的网站开始出现故障。每次迁移后问题都不同 - 一次是损坏/无效的 HTML,另一次是 JavaScript 语法错误,另一次是整个站点被包裹在我没有编写的 HTML 的 PRE 标记中!我发现“修复”损坏的唯一方法是从 app.yaml 中删除 inbound_services: -warmup 并重新部署

更奇怪的是,只有从自定义域访问该站点时才会发生损坏。如果我点击appspot.com 地址一切正常

相同的代码已经在传统的 Web 服务器上运行了一年多。

我头疼。感激地收到任何帮助/见解

标签: node.jsgoogle-app-engine

解决方案


预热请求通常不涉及新版本部署方案(但是,如果您当时的实时流量级别太高而无法由单个实例处理,它们可能会涉及)。它们仅在您已经有至少一个正在运行的实例并且需要启动新实例以处理传入流量增加时才涉及(与正在运行的实例具有相同的版本!) - 没有实时流量将被定向到新实例,直到它们成功处理了预热请求,从而表明它们已准备好处理真实的用户请求。

是的,预热请求是可选的。当动态扩展启动额外的实例来处理流量增加时,不使用预热请求会导致延迟增加。但是,如果您决定不使用它们,请确保您也不要启用预热入站服务。换句话说,您列表中的措施 1 和 2 属于一起,您要么执行两者,要么不执行。

执行 1 没有 2可能会导致部署期间出现一些中断:如果 GAE 决定在流量迁移期间启动多个实例,它可能会向某些实例发送预热请求,这些请求将失败,因为没有预热处理程序,导致 GAE 声明实例不健康并试图重新启动它们。您可以查看开发人员控制台上的Instances屏幕,选择新部署的服务版本和Instances图,并查找CreatedActive数字来检查这个理论。但即使得到证实,我不确定此类事件是否可以解释您描述的症状。

只有列表中的措施 3 和 4 与减少新版本部署期间的延迟相关。通常使用这些步骤时应该没有流量损失,当然前提是新版本没有故障。至少理论是这样的。


推荐阅读