【问题标题】:GAE - Java 11 migration - why are warmup requests not guaranteed to be called anymore?GAE - Java 11 迁移 - 为什么不再保证调用预热请求?
【发布时间】:2021-04-29 03:12:20
【问题描述】:

在 Java 8 Google App Engine 中有 ServletContextListener 允许您运行一些启动代码。在 Java 11 中,推荐的方式是 this。它指出:

请注意,预热请求不保证会被调用。在一些 而是发送加载请求的情况:例如,如果 实例是第一个启动的实例,或者如果有陡峭的 交通量增加。但是,将有“尽力而为”的尝试 如果预热请求是,则向已经预热的实例发送请求 已启用。

这对我来说有点问题,因为我有依赖项需要初始化才能成功运行。

如果预热请求不能保证再运行,我的代码会遇到运行时错误。

是否有可以 100% 使用 Java 11 Google App Engine 环境运行一些预热初始化代码的解决方案?

【问题讨论】:

  • 您是否打算迁移到 Java 11?有什么特别的原因吗?我之所以问,是因为在您与 Blaquiere 先生的对话中,您提到了 Cloud Endpoints,而我的理解是 Cloud Endpoints only supports Java 8。也许是这个原因?也许他们仍在使 Cloud Endpoints 适应 Java 11 的这一新限制?

标签: google-app-engine google-cloud-platform java-11


【解决方案1】:

解决方案是在预热请求和标准请求上调用负载依赖函数。为防止多次加载,可以使用全局变量;简而言之,单例模式。这里是一个伪代码

Boolean globalLoading = false;

public void warmup(){
  loadDependencies();
}

public void loadDependencies(){
   if (globalLoading) return;
   <TODO>
   globalLoading = true;
}

public String myGetEndpoint(params){
  loadDependencies();
  <TODO>
}
....

这样,您确定您的依赖项已在任何请求上加载,尽最大努力在预热中不影响第一个请求的服务延迟,但在更糟糕的情况下,延迟很差,但您的实例还可以。

【讨论】:

  • 您的意思是什么?对于“标准”请求?你的意思是在每个api方法之前调用loadDependencies()?在我的情况下有数百个 - 这样做似乎不太干净。
  • 我不知道你的框架,但通常,你可以在请求处理上插入一个拦截器。您可以在此阶段执行此操作以进行共同通话。不用担心开销,当库已经加载时,它只是一个 IF。 (大约 10 个 cpu 周期)
  • 我正在使用 Cloud Endpoints。你说的适用吗?
  • 您使用 Cloud Endpoint 框架,对吗?我确定有一个可以覆盖的拦截器链。但是您可能需要深入研究源代码才能看到。
猜你喜欢
  • 2014-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 2012-06-08
  • 2015-09-05
  • 2013-10-17
相关资源
最近更新 更多