Google app engine 应用程序引擎版本由";“违约”;在更改默认版本后,显示不一致,并在一段时间内反复振荡

Google app engine 应用程序引擎版本由";“违约”;在更改默认版本后,显示不一致,并在一段时间内反复振荡,google-app-engine,Google App Engine,我们的应用程序提供一个端点,该端点只报告os.environ['CURRENT_VERSION_ID']。我们将其用于跟踪当前设置为“默认版本”的版本的监视类型 从3月5日下午开始,我们注意到向该端点发出请求时出现了奇怪的行为。在我们更改默认版本后不久(通过“appcfg.py set_default_version”),对该端点的重复请求将在以前的默认和新的默认之间切换。这种情况持续大约10分钟,之后所有后续请求都将报告新的、正确的默认版本。因此,似乎在这10分钟的时间内,对我们正常的默认UR

我们的应用程序提供一个端点,该端点只报告os.environ['CURRENT_VERSION_ID']。我们将其用于跟踪当前设置为“默认版本”的版本的监视类型

从3月5日下午开始,我们注意到向该端点发出请求时出现了奇怪的行为。在我们更改默认版本后不久(通过“appcfg.py set_default_version”),对该端点的重复请求将在以前的默认和新的默认之间切换。这种情况持续大约10分钟,之后所有后续请求都将报告新的、正确的默认版本。因此,似乎在这10分钟的时间内,对我们正常的默认URL的请求将不一致地报告旧版本或新版本

这似乎是一种行为上的改变。我们的应用程序的默认版本的先前更改发生在3月1日,在此日期之前的所有其他版本更改都没有显示这种触发器行为


(从’s偷来的问题)

首先介绍一下背景:

  • App Engine在分布式基础架构中运行应用程序:应用程序接收的流量越多,在任何给定时间运行代码的实例(appservers)就越多
  • 出于可扩展性/简单性和许多其他原因,AppEngine不实现客户端appserver粘性;因此,对默认应用程序版本的任何请求都可以由任何appserver处理
更改应用程序的默认版本后,通过管理控制台更改标记为默认的版本,或部署与当前默认版本相同的主版本,有关此更改的信息将通过App Engine基础结构传播。当AppServer意识到新版本时,它们开始加载应用程序代码的新版本。一旦给定的appserver就绪,它将开始提供新版本的代码

在一段时间内,一些AppServer将为以前的默认版本提供服务,而其他AppServer则已为新的默认版本提供服务。因此,任何流量不小的应用程序都会看到您描述的行为

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


如果您希望对流程进行更多控制,可以使用App Engine的功能。在一个逐步的方式,你可以增加用户流量的百分比,你想直接在新版本。然后,应用程序引擎将基于客户端IP地址或cookie(用于web应用程序)提供版本粘性。您还可以使用流量拆分在一定比例(比如1%)的客户端上“加那利”应用程序的新版本。

感谢您提供的信息,Fred。您描述的行为是我对GAE这样的大型系统的期望。让我困惑的是,为什么我们在3月5日之前从未见过这种行为。在部署之前,对缺省值的所有更改似乎都是“原子化”地发生在我们身上的,所以看起来好像有什么改变了。不确定您是否可以为我们确认这一点,但最好确认这至少是预期的行为。您是否有可能遇到应用程序引擎“后端”而不是前端实例?您过去是否在任何时候使用过交通分流?有几个变量可能会影响从一个请求到另一个请求所看到的版本。然而,您描述的行为是预期的,而且肯定是我以前见过的。我还应该注意到,我们确实在不断改进和更改应用程序引擎调度程序,因此在以特定方式进行探测时观察到的行为变化并非完全出乎意料,尽管我无法轻松解释为什么您以前没有看到这一点。@FredSauer:不,我们在这段时间内肯定一直在使用前端。有一次,我们意外地打开了流量拆分,但我不相信我们曾经将它配置为除了将100%的流量传递到单个版本之外的任何其他功能;我们关闭了它,因为打开它似乎会禁用前端缓存。据我们所知,我们没有改变任何可能导致其出现这种行为的因素。只需在@beekay的观察中添加一些数据:截至最近,“某些应用服务器将为以前的默认版本提供服务的时间段”对我们来说最长持续15分钟以上。这是意料之中的吗?@FredSauer假设一旦通过,所有请求都将由新的默认版本提供服务的合理时间是多少?今天,我们看到旧版本在周围徘徊了约1小时。这是实例数的函数吗?我们能做些什么来加快速度吗?