为什么Google App Engine部署成功后仍运行旧版本代码?
可能的原因
- App Engine流量未完全切到新版本:若开启了渐进式流量迁移,或部署时未指定新版本接收全部流量,即使新版本部署成功,请求仍会被分配给旧版本实例。可在GAE控制台「版本」页查看当前流量分配比例确认。
- 旧预热实例未销毁:GAE为降低冷启动延迟,会保留旧的预热实例到新版本实例完全健康运行后再下线,部署完成后的数分钟内仍可能有请求走旧实例。
- AdonisJS生产环境缓存未更新:AdonisJS生产模式会缓存路由、配置、ORM元数据等内容,如果部署流程没有在代码更新后清理旧缓存、生成新缓存,运行时会读取旧缓存对应的旧逻辑。
- Node.js进程未完全重启:GAE常驻实例中的Node.js进程如果没有被完全终止重启,会持有旧代码的内存快照,不会加载新的文件内容。
解决步骤
- 确认并切换全量流量:进入Google Cloud控制台 → App Engine → 服务 → 对应API服务的「版本」标签,勾选最新部署的版本,点击「迁移流量」将100%流量分配给新版本,操作完成后等待3分钟再测试访问。
- 清理旧版本实例:流量完全切换后,选中所有历史旧版本,执行「停止」操作,强制销毁所有运行旧代码的实例,避免残留请求命中旧实例。
- 调整部署构建脚本:在
package.json的构建命令或app.yaml的启动前置脚本中加入AdonisJS缓存处理命令:
# 清理所有旧缓存 node ace cache:clear # 重新生成生产环境的配置、路由缓存 node ace config:cache node ace route:cache
确保缓存生成操作是在代码更新后执行,不要将本地生成的旧缓存打包到部署包中。
4. 强制实例冷启动:如果以上操作仍无效,可以临时将对应服务的实例数调整为0,等待1分钟所有实例销毁后,再调回原来的实例配置,强制所有实例重新拉取最新代码启动。
内容的提问来源于stack exchange,提问作者Zach W
相关产品推荐
相关产品推荐

