【问题标题】:Spring Boot apps keep restarting on App Engine FlexibleSpring Boot 应用程序不断在 App Engine Flexible 上重新启动
【发布时间】:2018-11-07 13:48:30
【问题描述】:

我有几个 Spring Boot 服务可以在本地完美运行,但它们会在 Google App Engine Flexible 上随机时间后重新启动。这些服务在 Spring Boot 库的帮助下使用 Google Cloud SQL 和 Pub/Sub。

当我部署服务时,它们可以正常工作,但过了一段时间它们会被 App Engine 重新启动。我将它们连接到 Spring Boot 管理员的一个实例,我在堆或磁盘空间或任何这些空间中看不到任何奇怪的东西。有时它们会在几个小时后重新启动,有时会更快。

我尝试将日志记录改为跟踪日志记录,似乎服务重启得更快。

我还注意到健康检查被调用了很多,尽管健康检查的默认配置说它应该是 5 分钟并且连续几次失败的健康检查 google app yaml config。但我从未在日志中看到任何失败的健康检查。

我看到的是健康检查进展顺利(200 回复),然后突然停止记录,几分钟后我看到了

Start command: java -showversion -agentpath:/opt/cdbg/cdbg_java_agent.so=--log_dir

这意味着应用引擎正在尝试再次启动应用。

app.yaml 看起来像: runtime: java env: flex service: x-service resources: memory_gb: 1.0 automatic_scaling: min_num_instances: 1 max_num_instances: 2 env_variables: SPRING_PROFILES_ACTIVE: "dev" liveness_check: path: "/actuator/health" readiness_check: path: "/actuator/health"

【问题讨论】:

  • 你能分享你的 app.yaml 吗?
  • 当然,添加它。没什么特别的
  • 抱歉耽搁了,当您在日志上暂停时,或者当您看到此“启动命令”...日志时,您的应用程序是否仍然可以访问?

标签: spring-boot google-app-engine app-engine-flexible


【解决方案1】:

所以在做了一些研究之后,我可能会对你的问题有所帮助。

我还注意到,健康检查被调用了很多,即使健康检查的默认配置说它应该是 5 分钟并且连续几次失败的健康检查谷歌应用程序 yaml 配置。但我从未在日志中看到任何失败的健康检查。

由于 Google 冗余运行状况检查器,这是正常行为:

" 健康检查频率

为确保高可用性,App Engine 会为每个运行状况检查器创建冗余副本。如果运行状况检查器失败,冗余的检查器可以立即接管。

如果您检查应用程序的 nginx.health_check 日志,您可能会发现运行状况检查轮询发生的频率比您配置的要高,这是因为冗余的运行状况检查器也遵循您的设置。这些冗余的运行状况检查器是自动创建的,您无法对其进行配置。”

我有几个 Spring Boot 服务可以在本地完美运行,但它们会在 Google App Engine Flexible 上随机时间后重新启动。这些服务在 Spring Boot 库的帮助下使用 Google Cloud SQL 和 Pub/Sub。

当我部署服务时,它们可以正常工作,但过了一段时间它们会被 App Engine 重新启动。我将它们连接到 Spring Boot 管理员的一个实例,我在堆或磁盘空间或任何这些空间中看不到任何奇怪的东西。有时它们会在几个小时后重新启动,有时会更快。

查看 GAE 管理实例的方式,这可能是一种正常行为,只要您的应用程序不断响应请求。通过使用automatic_scaling,您正在定义动态实例。动态实例根据它们接收的负载打开/关闭。因此,您可能会看到工作中的自动缩放。转到 2 个实例,然后返回一个,依此类推。

我会邀请您通过将target_utilization 的默认阈值提高到0.9 之类的值来测试它,看看它是否经常扩展。或者只是使用manual_scaling,所以你只有常驻实例。进行测试的原因是,您看到的日志可能是应用引擎实例管理的预期行为。由于您的应用程序对运行状况检查和就绪状态的响应正常,并且您提到内存利用率没有显示任何异常情况,所以除了自动缩放功能之外,我想不出其他任何可能导致该问题的原因。

我希望这会有所帮助!

来源:

https://cloud.google.com/appengine/docs/flexible/java/reference/app-yaml https://cloud.google.com/appengine/docs/flexible/custom-runtimes/configuring-your-app-with-app-yaml https://cloud.google.com/appengine/docs/flexible/java/how-instances-are-managed

【讨论】:

  • 您好,该服务似乎没有继续响应请求。我们甚至将设置更改为具有最大和最小实例 1,然后服务也关闭了。即使使用最小实例 1 和最大实例 2,服务似乎也会下降。当我们查看 stackdriver 时,我们看到的唯一 cpu 峰值是在启动期间。
  • 您的应用程序日志中似乎一切正常?
  • 是的,甚至把它放在跟踪日志中,没有什么特别的或我们可以看到的错误。
  • @GeertOlaerts - 你有没有发现是什么导致了这种行为?我目前遇到了同样的问题,并且即将将此服务移至 ec2 实例,以避免处理这些自动重启。如果自动重启是在 Google App Engine 中使用容器的一个不可避免的方面,即使明确定义了 1 个 pod min/max 并且没有运行状况检查停机时间,那么这是重要的信息。
猜你喜欢
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 2018-06-12
  • 2019-05-04
  • 2014-08-04
  • 1970-01-01
  • 2018-01-13
  • 2017-01-16
相关资源
最近更新 更多