"默认"提供的App Engine版本似乎不一致,并且在更改默认版本后会持续一段时间

kam*_*ens 6 google-app-engine

我们的应用程序服务于一个只报告os.environ ['CURRENT_VERSION_ID']的端点.我们将此用于一种监视,它跟踪当前将哪个版本设置为"默认版本".

从3月5日下午开始,我们在向此端点发出请求时发现奇怪的行为.在我们更改默认版本后不久(通过"appcfg.py set_default_version"),对此端点的重复请求将在先前的默认值和新默认值之间翻转.这会持续大约10分钟,之后所有后续请求将始终报告新的正确默认版本.因此,在这10分钟的窗口期间,对我们的正常默认URL的请求似乎不一致地报告旧版本或新版本.

这似乎是行为的改变.我们的应用程序的默认版本的先前更改发生在3月1日,并且在该日期之前的每个其他版本更改都没有表现出这种翻转行为.

(问题来自我队友错误报告)

Fre*_*uer 10

首先是一些背景知识:

  • App Engine在分布式基础架构中运行您的应用程序:您的应用程序获得的流量越多,在任何给定时间运行代码的实例(应用程序服务器)就越多
  • 出于可伸缩性/简单性和许多其他原因,App Engine不实现客户端< - > appserver粘性; 因此,任何应用程序服务器都可以处理对默认应用程序版本的任何请求

更改应用程序的默认版本后,通过更改通过管理控制台标记为默认版本的版本,或者通过部署与当前默认版本相同的主要版本,有关此更改的信息将通过App Engine基础结构传播.随着应用程序了解新版本,他们开始加载新版本的应用程序代码.一旦给定的appserver准备就绪,它将开始提供新版本的代码.

在某段时间内,某些应用服务器将提供先前的默认版本,而其他应用服务器已经在提供新的默认版本.因此,预计任何具有非常重要流量的应用都会看到您描述的行为.

我们一直在努力减少这些版本更改所需的时间,但我们最关心的是确保转换顺利进行.如果应用程序具有大量服务于先前版本的实例,则App Engine需要确保始终有足够的容量(组合旧的和新的应用程序服务器)来为所有当前流量提供服务.应用程序的先前版本和新版本可能需要不同数量的应用程序服务器(由于版本之间的性能差异),这是转换无法"立即"安全执行的另一个原因.

如果您想要更好地控制流程,可以使用App Engine的流量拆分功能.以步进方式,您可以增加您希望在新版本中指向的用户流量百分比.然后,App Engine将根据客户端IP地址或cookie(针对Web应用程序)提供版本粘性.您还可以在某些百分比(比如说1%)的客户端上使用流量拆分将"金丝雀"应用到新版本的应用程序中.