首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >App引擎urlfetch DeadlineExceededError

App引擎urlfetch DeadlineExceededError
EN

Stack Overflow用户
提问于 2021-12-31 03:27:32
回答 1查看 252关注 0票数 0

我有两个服务。一个托管在中,另一个托管在云运行中。

我使用从GAE中的耳取 (Python2)导入的google.appengine.api来调用Cloud提供的API。

偶尔也会出现一些(比如每周<10 )的DeadlineExceededError,如下所示:

代码语言:javascript
复制
Deadline exceeded while waiting for HTTP response from URL

但这几天这种错误突然频繁发生(比如每天40次)。不知道是因为圣诞节高峰期还是什么原因。

我已经检查过云运行的负载均衡器日志,结果是,请求从未到达负载均衡器

以前有没有人遇到过类似的问题?GAE urlfetch有问题吗?

我发现了一个类似的转换,但建议是处理错误.

想知道我能做些什么来缓解这个问题。非常感谢。

更新1

再次检查,发现来自again的一些请求确实出现在云运行负载均衡器日志中,但时间很奇怪:

例如:

GAE项目的日志

代码语言:javascript
复制
10:36:24.706 send request
10:36:29.648 deadline exceeded

来自云运行项目的日志

代码语言:javascript
复制
10:36:35.742 reached load balancer
10:36:49.289 finished processing

不知道为什么请求要这么长时间才到达负载均衡器.

更新2

我使用位于美国的GAE标准,设置如下:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

发布于 2021-12-31 07:25:49

等待来自URL的HTTP的截止日期超过了,实际上是一个DeadlineExceededError。由于超出了截止日期,因此未获取URL。这种情况可能发生在客户端提供的截止日期(您需要更改该截止日期),或者如果客户端不提供截止日期参数,则系统默认设置。

当您发出HTTP请求时,App将此请求映射到URLFetch。URLFetch有自己的期限是可配置的。见URLFetch文档

您可以为每个URLFetch请求设置一个截止日期。默认情况下,获取的截止日期是5秒。可以通过以下方式更改此默认设置:

在您的appengine.api.urlfetch.defaultDeadline应用程序-web.xml配置文件中包括以下设置。指定以秒为单位的超时:

代码语言:javascript
复制
<system-properties>:
    <property name="appengine.api.urlfetch.defaultDeadline" value="10"/>
</system-properties>

还可以使用urlfetch.set_default_fetch_deadline()函数调整默认截止日期。此函数将新的默认截止日期存储在线程局部变量上,因此必须为每个请求设置它,例如,在自定义中间件中。

代码语言:javascript
复制
from google.appengine.api import urlfetch 
urlfetch.set_default_fetch_deadline(45)

如果云运行服务正在处理长请求,则可以增加请求超时。如果服务没有在指定的时间内返回响应,则请求结束,服务返回HTTP 504错误。将YAML文件中的timeoutSeconds属性更新为:

代码语言:javascript
复制
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: SERVICE
spec:
  template:
    spec:
      containers:
      - image: IMAGE
      timeoutSeconds: VALUE

可以使用以下命令随时更新给定修订的请求超时:

代码语言:javascript
复制
gcloud run services update [SERVICE] --timeout=[TIMEOUT]

如果请求在早期使用错误代码503终止,则可能需要为语言框架设置更新请求超时:Node.js开发人员可能需要通过server.setTimeout更新`server.timeout属性(使用server.setTimeout(0)‘以实现无限超时),具体取决于所使用的版本。Python开发人员需要更新Gunicorn的默认超时

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70538736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档