我有两个服务。一个托管在中,另一个托管在云运行中。
我使用从GAE中的耳取 (Python2)导入的google.appengine.api来调用Cloud提供的API。
偶尔也会出现一些(比如每周<10 )的DeadlineExceededError,如下所示:
Deadline exceeded while waiting for HTTP response from URL但这几天这种错误突然频繁发生(比如每天40次)。不知道是因为圣诞节高峰期还是什么原因。
我已经检查过云运行的负载均衡器日志,结果是,请求从未到达负载均衡器。
以前有没有人遇到过类似的问题?GAE urlfetch有问题吗?
我发现了一个类似的转换,但建议是处理错误.
想知道我能做些什么来缓解这个问题。非常感谢。
更新1
再次检查,发现来自again的一些请求确实出现在云运行负载均衡器日志中,但时间很奇怪:
例如:
GAE项目的日志
10:36:24.706 send request
10:36:29.648 deadline exceeded来自云运行项目的日志
10:36:35.742 reached load balancer
10:36:49.289 finished processing不知道为什么请求要这么长时间才到达负载均衡器.
更新2
我使用位于美国的GAE标准,设置如下:
runtime: python27
api_version: 1
threadsafe: true
automatic_scaling:
max_pending_latency: 5s
inbound_services:
- warmup
- channel_presence
builtins:
- appstats: on
- remote_api: on
- deferred: on
...我试图调用的云运行托管API网关位于亚洲。在它前面有一个谷歌负载均衡器,它的类型是HTTP(S) (classic)。
更新3
我编写了一个简单的脚本来定期使用axios (其超时设置为5s)直接调用Cloud端点。过了一会儿,一些请求被超时了。我在云运行项目中查看了日志,发现了两种不同的现象:
对于请求A,就像我在更新1中提到的一样,在负载均衡器和云运行版本中都可以找到日志。
Time of CR revision log - Time of LB log > 5s,所以我认为这是一个可以接受的暂停。
但是对于请求B,根本没有找到任何日志。
所以我想问题不在于urlfetch或GAE?
发布于 2021-12-31 07:25:49
等待来自URL的HTTP的截止日期超过了,实际上是一个DeadlineExceededError。由于超出了截止日期,因此未获取URL。这种情况可能发生在客户端提供的截止日期(您需要更改该截止日期),或者如果客户端不提供截止日期参数,则系统默认设置。
当您发出HTTP请求时,App将此请求映射到URLFetch。URLFetch有自己的期限是可配置的。见URLFetch文档。
您可以为每个URLFetch请求设置一个截止日期。默认情况下,获取的截止日期是5秒。可以通过以下方式更改此默认设置:
在您的appengine.api.urlfetch.defaultDeadline应用程序-web.xml配置文件中包括以下设置。指定以秒为单位的超时:
<system-properties>:
<property name="appengine.api.urlfetch.defaultDeadline" value="10"/>
</system-properties>还可以使用urlfetch.set_default_fetch_deadline()函数调整默认截止日期。此函数将新的默认截止日期存储在线程局部变量上,因此必须为每个请求设置它,例如,在自定义中间件中。
from google.appengine.api import urlfetch
urlfetch.set_default_fetch_deadline(45)如果云运行服务正在处理长请求,则可以增加请求超时。如果服务没有在指定的时间内返回响应,则请求结束,服务返回HTTP 504错误。将YAML文件中的timeoutSeconds属性更新为:
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: SERVICE
spec:
template:
spec:
containers:
- image: IMAGE
timeoutSeconds: VALUE或
可以使用以下命令随时更新给定修订的请求超时:
gcloud run services update [SERVICE] --timeout=[TIMEOUT]如果请求在早期使用错误代码503终止,则可能需要为语言框架设置更新请求超时:Node.js开发人员可能需要通过server.setTimeout更新`server.timeout属性(使用server.setTimeout(0)‘以实现无限超时),具体取决于所使用的版本。Python开发人员需要更新Gunicorn的默认超时。
https://stackoverflow.com/questions/70538736
复制相似问题