【问题标题】:App engine 499 HTTP response for long running tasks长时间运行任务的应用引擎 499 HTTP 响应
【发布时间】:2018-07-18 06:12:34
【问题描述】:

我们有一个用 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 响应被发回 -> (工作仍在应用程序线程中运行) -> 调用者重复请求 -> 我们有 2 个相同的请求正在运行 -> 重复

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

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

这让我相信 App Engine 调度程序/负载平衡器以某种方式决定请求在中止之前需要多长时间。我们是否缺少某种超时配置?任何人都可以确定问题可能出在哪里(tomcat、gce、spring...)?

【问题讨论】:

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


    【解决方案1】:

    错误代码描述为here:

    操作被取消,通常由调用者取消。

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

    我怀疑是以下问题:

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

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

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

    我无法确定问题所在。您能否分享有关错误或长期运行请求的更多信息,以查看它是否共享一些信息?

    【讨论】:

    • 我们发现使用 Postman 创建请求时存在此问题,并且 Spring Boot Rest Template 也收到此超时。我相信我们的请求是使用 SSL 路由的,您是否有任何资源可以表明负载均衡器是否有任何限制?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 2018-04-17
    • 1970-01-01
    • 2016-08-06
    相关资源
    最近更新 更多