【问题标题】:Is google.appengine.api.urlfetch deadline limited to 60s?google.appengine.api.urlfetch 的最后期限是否限制为 60 秒?
【发布时间】:2017-01-11 09:48:32
【问题描述】:

我在谷歌应用引擎上使用 python,并不断收到google.appengine.api.urlfetch_errors.DeadlineExceededError 来自执行某些后端处理的机器的请求。这些请求大约需要 60 秒,有时会更长一些,所以我试图延长截止日期。

请求包含在重试中,从日志中我可以看到重试之间的时间始终为 ~60 秒。我认为这要么是因为我配置错误,要么是误解了截止日期的限制。

机器配置是:

instance_class: B8
basic_scaling:
  max_instances: 1
  idle_timeout: 10m

我使用的代码是(为简单起见已编辑):

from google.appengine.api import urlfetch
from retrying import retry

timeout = 600
retries = 10

@retry(
    stop_max_attempt_number=retries,
    wait_exponential_multiplier=1000,
    wait_exponential_max=1000*60*5
)
def fetch(url):
    """Fetch remote data, retrying as necessary"""
    urlfetch.set_default_fetch_deadline(timeout)
    result = urlfetch.fetch(url)
    if result.status_code != 200:
        raise IOError("Did not receive OK response from server")
    return result.content

data = fetch(config['url'])

我已尝试将截止日期明确设置为 urlfetch.fetch(url, deadline=timeout),但设置默认值似乎是大多数人建议的方法。

谁能澄清是否可以为deadline 设置最大值?

【问题讨论】:

  • 我很确定 60 秒是 urlfetch (和标准交互式请求)的最大值,但它似乎不再被记录。 60 秒是保持连接打开的很长一段时间 - 你最好轮询另一端?
  • 谢谢snakecharmerb。老实说,我发现了相互矛盾的信息(其中一些可能来自旧版本的 GAE)。我发现消息来源声称 60 年代是最大值,而其他人则说这仅适用于 automatic_scaling 类。当然,在 github 上进行搜索会发现很多人调用 urlfetch.set_default_fetch_deadline() 的值高于 60,并且鉴于我无法在文档中的任何地方找到记录的限制,我希望有人告诉我我只是遗漏了一些明显的东西!
  • 是的,不幸的是set_default_fetch_deadline 的文档字符串只是说“这个函数不对值进行任何范围或类型检查”,这不是很有帮助。不管限制如何,我都会考虑尝试一种不同的方法来避免长时间绑定实例,除非传输数据需要很长时间? FWIW 其价值this java doc 表示出站请求为 60 秒,您可以想象在 java-world 中也有同样的限制。,
  • 感谢您提供的链接 - 以前没见过那个链接。这听起来确实几乎是决定性的。这是一台通过 cron 运行后端任务的机器。该任务在获取数据文件后需要约 45 分钟的数据处理,因此需要一些处理时间不是问题。不幸的是,它获取的原始数据非常大(并且服务器非常慢),因此请求需要 60 秒 +/- 10 秒。我想我需要考虑拆分请求,但我不确定这是由我请求的服务器提供的。
  • 如果遥控器支持它们,也许你可以使用sockets 而不是http?看起来他们可能不会超时至少两分钟。或者使用计算引擎实例而不是后端。

标签: python google-app-engine google-app-engine-python


【解决方案1】:

请求计时器

Google App Engine 请求计时器 (Java/Python/Go) 确保请求具有有限的生命周期,并且不会陷入无限循环。目前,对前端实例的请求的截止时间是 60 秒。 (后端实例没有相应的限制。)每个请求,包括预热(请求/_ah/warmup)和加载请求(“loading_request=1”日志头),都受此限制。

如果请求未能在 60 秒内返回并且抛出 DeadlineExceededError 且未被捕获,则请求中止并返回 500 内部服务器错误。如果 DeadlineExceededError 被捕获,但响应速度不够快(不到一秒),请求将被中止并返回 500 内部服务器错误。

就我阅读文档而言,我认为应用引擎中的最大请求超时为 60 秒。 Here is the link to the documentation

【讨论】:

  • 感谢 Bravin,我已阅读该文档并正在使用它推荐的内容,但是当我更改截止日期(例如到 600 秒)时,它似乎仍然在最多 60 秒后超时。我是什么试图确定是否有一个最大值作为限制,或者我是否在我的代码中犯了错误。
  • 感谢您抽出时间回复,但这是google.appengine.runtime.DeadlineExceededError,而不是google.appengine.api.urlfetch_errors.DeadlineExceededError。此外,请求截止日期仅指自动扩展的实例。手动和基本伸缩实例都可以run indefinitely per the docs
  • @JamieCollinson 我很确定 60 秒是 urlfetch (和标准交互式请求)的最大值,但它似乎不再被记录。 60 秒是保持连接打开的很长一段时间 - 你可能会更好地轮询另一端?以应用引擎队列为例。
猜你喜欢
  • 2011-12-27
  • 2013-11-11
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多