Google App Engine 文档指出了以下两条信息:
1- App Engine 为低延迟应用程序保留自动扩展容量,其中应用程序在不到 1 秒的时间内响应请求。(https://cloud.google.com/appengine/docs/standard/python3/how-requests-are-handled)
2- App Engine 任务具有特定的超时时间,具体取决于运行这些任务的服务的扩展类型。对于在标准环境中运行的工作服务:自动扩展:任务处理必须在 10 分钟内完成。(https://cloud.google.com/tasks/docs/creating-appengine-handlers)
为了符合 (1),我正在编写 API,将任何耗时的处理推迟到 CloudTask 任务,这使得我的 API 能够在不到一秒的时间内响应所有客户端请求并从自动扩展中受益。
但我还必须编写处理程序,根据 Cloudtask 服务的请求执行耗时处理。我还希望这些处理程序位于 GAE 上,理想情况下还能自动扩展。
我没有看到任何正式声明,允许 GAE 服务知道我的应用程序的某个部分是面向客户端的 API 还是插入 Cloudtask 的任务处理程序。因此,我不明白 GAE 如何处理我引用的两个要求。
我担心我的任务处理程序会阻碍我的应用程序性能指标,并因此阻止自动扩展。
我应该将这些处理程序部署到不同的项目中吗?但是,如果它们执行任务需要超过 1 秒的时间,我该如何实现自动缩放?
答案1
根据官方 GCP文档:
卸载的任务将添加到队列中,该队列会保留该任务,直到成功执行为止。根据您的初始配置,队列还可以充当一种调度流控制。您可以创建并配置队列,然后由 Cloud Tasks 服务进行管理。添加任务后,队列会调度它们并确保您的工作人员可靠地处理它们。该服务负责处理与该过程相关的复杂性,例如面向用户的延迟成本、服务器崩溃、资源消耗限制和重试管理。
Cloud Tasks 与 App Engine 目标排队:
对于 App Engine 目标,Cloud Tasks 服务还会根据任务(或不太常见的队列本身)的配置方式将任务请求转发给位于 App Engine 内的工作器。这些队列以可靠的、可配置的速率分派请求。它们保证任务的可靠执行 - 成功后,所有工作器都必须向 Cloud Tasks 服务发送 HTTP 响应代码 (200-299),在此实例中是在基于服务的实例扩展类型的截止期限之前:自动扩展为 10 分钟,手动扩展为最多 24 小时。如果发送了不同的响应或没有响应,则重试该任务。
由于处理程序是 App Engine 的一部分,Cloud Tasks 服务本身可以完成任务的大部分流程管理,根据流量扩大或缩小工作量,并在任务完成后删除任务。
为了尽量减少延迟,你可以设置不同的GAE 工作者服务负责任务处理,然后配置任务队列的路由。