适用于长时间运行任务的App Engine 499 HTTP响应

时间:2018-07-18 06:12:35

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

我们有一个用Spring Boot(Java 8)编写并托管在App Engine灵活环境中的REST API。

当前app.yaml如下:

runtime: java
api_version: '1.0'
env: flex
threadsafe: true
manual_scaling:
  instances: 1
resources:
  cpu: 4
  memory_gb: 16
liveness_check:
  path: "/healthcheck"
  check_interval_sec: 30
  timeout_sec: 4
  failure_threshold: 2
  success_threshold: 2
  initial_delay_sec: 300

我们注意到,对于其中一个端点的长时间运行(1-5分钟)的请求通常会返回499 HTTP响应代码,这不是我们期望的。

它看起来像这样: POST /endpoint->(在应用程序中开始工作)-> 499返回响应->(工作仍在应用程序线程中运行)->呼叫方重复请求->我们有两个相同的请求正在运行->重复

为避免这种情况,我们将端点工作移至后台ThreadPoolTaskExecutor,该端点不再引起任何问题。

但是出现了其他问题-其他端点/second现在也遇到了相同的499早期响应问题,即使之前从未这样做过(该端点的通常运行时间是从缓存时的1秒到没有缓存时的3分钟。 )

这使我相信App Engine调度程序/负载平衡器可以某种方式决定在请求被终止之前可以花费多长时间。我们是否缺少某种超时配置?任何人都可以找出问题所在(tomcat,gce,spring等)吗?

1 个答案:

答案 0 :(得分:0)

错误代码描述为here

  

该操作通常被调用方取消。

     

HTTP映射:499个客户端关闭请求

我怀疑是以下问题:

POST /endpoint->(在应用程序中开始工作)-> 客户端断开连接-> ** {499已记录**,没有响应返回->(工作仍然在应用程序线程中运行)->呼叫方重复请求->我们有2个相同的请求正在运行->重复

这可能是因为请求花费的时间太长,并且客户端触发刷新或重复请求。检查this post讨论相同的错误。代码或GCP基础架构可能没有任何问题。

App Engine Flexible中的请求持续时间有60 minutes limit,因此这不是他的问题。如果您不使用SSL connections,则都不是负载均衡器,因为它不会参与。

我无法确定问题所在。您能否分享有关错误或长时间运行的请求的更多信息,以查看其是否有共同之处?