首先介绍一下背景:
- App Engine 在分布式基础架构中运行您的应用程序:您的应用程序接收的流量越多,在任何给定时间运行您的代码的实例(应用服务器)就越多
- 出于可扩展性/简单性和许多其他原因,App Engine 没有实现客户端 <-> 应用服务器粘性;因此,对默认应用版本的任何请求都可以由任何应用服务器处理
更改应用程序的默认版本后,通过管理控制台更改标记为默认的版本,或部署与当前默认相同的主要版本,有关此更改的信息将通过 App Engine 基础架构传播。随着应用服务器意识到新版本,它们开始加载新版本的应用程序代码。一旦给定的应用服务器准备就绪,它将开始提供新版本的代码。
在一段时间内,一些应用服务器将提供以前的默认版本,而其他应用服务器已经在提供新的默认版本。因此,预计任何具有大量流量的应用都会看到您描述的行为。
我们一直在努力减少这些版本更改所花费的时间,但我们最关心的是确保过渡顺利进行。如果应用程序有大量实例为以前的版本提供服务,App Engine 需要确保始终有足够的容量(结合新旧应用服务器)来服务所有当前流量。应用程序的先前版本和新版本可能需要不同数量的应用服务器(由于版本之间的性能差异),这是无法“立即”安全地执行转换的另一个原因。
If you'd like more control over the process, you can use App Engine's Traffic Splitting feature. In a step wise fashion you can increase the percentage of user traffic you'd like to direct at the new version. App Engine will then provide version stickiness based on either client IP address or a cookie (for web apps). You can also use Traffic Splitting to 'canary' a new version of the application on some percentage (say 1%) of clients.