GCP 上 运行 长 Python 脚本的最佳方式

Best way for running long Python scripts on GCP

我们公司正在开始一个新项目,基本上我们每天两次为每个客户 运行 几个 Python 脚本。 所以这个想法是,每天两次触发 Cloud Function,该函数将为每个创建 App Engine / Cloud 运行 或任何其他无服务器服务 [=23] 的新实例的客户端触发 Python 脚本=]的报价。

一开始我们想用 Cloud Functions,但很快我们发现它们不适合长 运行ning Python 脚本,脚本最终会计算和收集不同的信息每个客户端并将它们写入 Firebase。

流程的流程是:触发 Cloud Function -> 每个客户端的函数触发 GCP 实例 -> 每个客户端的脚本 运行ning -> 正在将输出保存到 Firebase。

如果没有专用服务器,推荐的方法是什么?哪种 GCP 无服务器服务最适合?

您可以使用 Cloud Tasks.

执行“长”运行 Google App Engine (GAE) 任务

多长时间(这就是为什么我用引号引起来)取决于您为 GAE 项目实例使用的缩放类型。设置为 'automatic scaling' 的实例最多执行 10 分钟,而设置为 'manual' 或 'basic' 的实例最多执行 24 小时。

来自较早的link

....all workers must send an HTTP response code (200-299) to the Cloud Tasks service, in this instance before a deadline based on the instance scaling type of the service: 10 minutes for automatic scaling or up to 24 hours for manual scaling. If a different response is sent, or no response, the task is retried....

添加更新(30 分钟和 24 小时之间似乎有些混淆)

标准 HTTP 请求的最长执行时间为 30 分钟(source) while GAE Endpoints can run for up to 24 hours if you're using manual scaling (source

@NoCommandLine 的回答是最好的建议,如果您想设置更长的 运行 操作,云 运行 也是一个不错的选择,因为超时可以设置在 5 分钟(默认)和 60 分钟之间分钟。您可以通过 Cloud Console, command line or YAML.

设置或更新请求超时

同时,Cloud Functions 的执行时间只有 1 分钟(默认),最多可以设置为 9 分钟。

您可以查看下面的完整文档:

你也可以通过这个link查看一个相关的SO问题。

有很多很棒的答案!这里的关键是解耦和分布式处理。

当您谈论解耦时,您可以使用 Cloud Task(您可以在其中添加具有速率限制的流量控制或在将来推迟任务)或 PubSub(更简单的消息队列解决方案)。

而云 运行 要求 运行 最多处理 15 分钟。但是你必须对其进行微调(见下面我的提示)

所以,总结一下过程

  • 您必须每天触发两次 Cloud Functions。您可以为此使用 Cloud Scheduler。
  • 触发的 Cloud Functions 获取客户端列表(在数据库中?)并为每个客户端在 Cloud Task 上创建一个任务(或在 PubSub 中创建一条消息)
  • 每个任务(或消息)调用云上的 HTTP 端点 运行 为每个客户端执行该过程。在 Cloud 运行.
  • 上将超时设置为 30 分钟

但是,如果您的处理是计算密集型的,则必须调整 Cloud 运行。如果在 1vCPU 上处理 1 个客户端需要 15 分钟,这意味着如果您不想达到超时,则每个 CPU 不能处理超过 1 个客户端(2 个客户端可以引导您在同一个 CPU 上花费大约 30 分钟,你可以达到超时)。为此,我建议你将Cloud运行的并发参数设置为1,一次只处理一个请求(当然,如果你在Cloud运行上设置2或4CPU您还可以将并发参数增加到 2 或 4,以允许在同一实例上进行并行处理,但在不同的 CPU).

如果处理不是 CPU 密集(您执行 API 调用并等待答案),则很难说。尝试使用并发数 5、10、30...并观察已处理请求的 behaviour/latency。不用担心,使用 Cloud Task 和 PubSUb,您可以设置超时重试策略。

最后一件事:你的处理是幂等的吗?我的意思是,如果您 运行 对同一个客户端执行同一个过程 2 次,结果是正确的还是有问题?尝试使解决方案幂等以克服重试问题和分布式计算(包括重播)可能发生的全局问题