我们有一个用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等)吗?
答案 0 :(得分:0)
错误代码描述为here:
该操作通常被调用方取消。
HTTP映射:499个客户端关闭请求
我怀疑是以下问题:
POST /endpoint
->(在应用程序中开始工作)-> 客户端断开连接-> ** {499
已记录**,没有响应返回->(工作仍然在应用程序线程中运行)->呼叫方重复请求->我们有2个相同的请求正在运行->重复
这可能是因为请求花费的时间太长,并且客户端触发刷新或重复请求。检查this post讨论相同的错误。代码或GCP基础架构可能没有任何问题。
App Engine Flexible中的请求持续时间有60 minutes limit,因此这不是他的问题。如果您不使用SSL connections,则都不是负载均衡器,因为它不会参与。
我无法确定问题所在。您能否分享有关错误或长时间运行的请求的更多信息,以查看其是否有共同之处?