在 App Engine 标准环境中将运行时从 Python 更改为 Go

Change runtime from Python to Go in App Engine standard environment

我在 AppEngine 上有一个 99% 静态的网站。在 Python 2.7 运行时是 运行。现在是时候改进这个 webapp 了,因为我已经有差不多 none Python 代码了,我更愿意用 Go 来写它。

我可以将运行时从 Python 2.7 更改为 Go,同时保持项目完整吗? 具体来说,我想保留相同的应用程序 ID,相同的自定义附加到它的域、相同的 SSL 证书等。

我必须做什么才能做到这一点?我肯定必须在 app.yaml 中更改 runtime。还有别的吗?

奖金问题:这种变化会在没有停机的情况下发生吗?

如果能提供指向相关文档的任何链接(在实时应用程序上交换运行时),我将不胜感激。我找不到。

指定 runtime 以及 version 的新值。部署后,您将拥有一个旧版本 Python 和一个新版本 Go。不会有任何停机时间(与部署更新版本的 Python 时相同)。

与其相信 links/docs(这可能已过时或并非 100% 完全符合您的要求),为什么不创建一个新的 GAE-Std 项目用于测试目的并亲自尝试.拥有 GAE-Std 测试项目有利于测试新功能(尤其是对于无法访问您笔记本电脑上的开发环境的其他测试人员)。

GAE 服务提供完整 code isolation。因此,应该可以简单地部署一个新版本的服务,它可以用不同的语言编写,甚至可以使用不同的 GAE (standard/flex) 环境。就我个人而言,我没有经历语言变化,但我确实经历了将单一服务应用程序拆分为多服务应用程序,我认为没有理由不适用相同的原则。

也许首先将新版本开发为一个单独的应用程序,以便能够正确测试它而不会冒对旧版本产生意外影响的风险,然后才将代码作为新版本引入旧应用程序。那就是使用 GAE project isolation. You can, in fact, test the entire version migration as a separate app if you so desire without even touching the existing app. I am using this technique - a separate app ID - to implement a staging environment for my app, completely isolated from my production app, see How to copy / clone entire Google App Engine Project

确保在部署时不要将流量切换到新版本。这使应用程序可以使用旧版本。首先测试新版本是否按预期使用 Targeted routing. Then maybe use Splitting traffic across multiple versions 执行 A/B 测试,只有一小部分流量流向新版本。最后,当对结果满意时,将所有流量切换到新版本。

您需要特别注意所有 services/versions 共享的应用级配置(调度、cron、队列、数据存储索引)。它们需要在 2 个版本中具有相同的功能。服务隔离对它们不适用,只有项目隔离才能保证对老版本没有影响。

应该不需要对应用程序 ID、自定义域映射或 SSL 配置进行任何更改。上述测试应该可以证实这一点。

一些与返工相关的可能有趣的帖子 services/modules:

  • Converting App Engine frontend versions to modules