自动缩放中 PubSub 推送订阅的 App Engine 请求超时

App Engine Request Timeout for PubSub Push Subscription in Automatic Scaling

在 python2 自动扩展的 App Engine 上,请求处理程序对于普通 http 请求的最大超时为 60 秒,对于任务队列请求的最大超时为 10 分钟。

我找不到有关 pubsub 任务的任何信息。 他们是否也像 Taskqueue/cloud-tasks 一样获得 10 分钟的超时?

此外,google 似乎正在更改他们的文档,在 python3 中,所有请求都将有 10 分钟的超时时间: https://cloud.google.com/appengine/docs/standard/python3/how-instances-are-managed

但是如果你在 python3 中访问他们的 cron 文档,它会说 An HTTP request invoked by cron can run for up to 60 seconds https://cloud.google.com/appengine/docs/standard/python3/scheduling-jobs-with-cron-yaml

当您提到 Pub/Sub 任务时,我理解您的意思是让 App Engine 服务作为推送订阅者订阅主题。

根据 Cloud Pub/Sub 文档,您认为“队列”基本上是 Pub/Sub 根据收到成功响应的速率动态调整推送请求的速率。

对于推送订阅,Pub/Sub 将 HTTP 成功响应视为接收消息的工作人员的确认。但是,您必须记住,提供此响应的截止日期最初由订阅的 ackDeadline 确定,即 10 秒默认值,如 Managing Subscriptions 文档中所述。

根据 Receiving push messages 文档,如果 App Engine 订阅者未在 ackDeadline 内回复成功的 HTTP 状态代码,Pub/Sub 将重试传递,直到订阅的消息保留后消息过期期间。

方便的是,您可以将推送订阅的 ackDeadline 设置为最长 10 分钟,使其与具有自动功能的 Python3 App Engine 标准的持续时间相同缩放截止日期。

关于你关于cron触发请求的区别的问题,它确实是这样设计的,但我无法告诉你为什么会这样。

另外,关于Pub/Sub和Cloud Tasks的区别可以参考官方文档。有趣的是,两个 Cloud Task and Pub/Sub 文档都包含一个略有不同的页面,讨论两者之间的差异。

编辑:

我决定对 Python2 应用程序的超时期限进行测试,我确认即使在接收来自 Pub/Sub 推送订阅的请求时,该限制也确实存在。

我创建了 3 个基本任务处理程序,分别等待 80、120 和 610 秒发送 200 个 http 响应。在发布主题时,我注意到以下内容:

  • 正如预期的那样,等待超过 10 分钟的服务未能确认所有请求。
  • 等待 120s 的服务在少数请求中成功,但在大多数请求中失败。
  • 奇怪的是,等待 80 秒的服务成功确认了所有请求。

这让我相信 Python2 的截止日期并不像文档中所说的那样硬性限制。但是,我仍然认为在开发应用程序时牢记记录的截止日期是理想的,并且要注意,即使对于 Pub/Sub 任务也会有所应用。

由于运行时很可能很快就会被弃用,我认为文档中指定 Pub/Sub 任务截止日期的任何更改都不会及时获得批准,就像 Python3 App Engine 在配置的 ackDeadline 之前终止请求没有风险。