【问题标题】:Rapidly creating cloud tasks using Cloud Task, Cloud Functions, and GAE使用 Cloud Task、Cloud Functions 和 GAE 快速创建云任务
【发布时间】:2020-03-21 12:44:48
【问题描述】:

我正在使用 App Engine 根据列表中的项目触发多个 Cloud Tasks 的创建:

function_url="https://us-central1-myproject.cloudfunctions.net/some-cloud-function"

someTasks = [
{'id': 'task-1'},
{'id': 'task-2'},
{'id': 'task-3'},
...
{'id': 'task-1000'},
]

当前使用以下命令创建任务:

Parallel(backend='threading', n_jobs=100)(
        delayed(create_document_task)(function_url=function_uri, data=task) for task in someTasks 
                    )

以上代码并行创建任务,并指示任务队列将负载定向到特定的云功能。

并行执行此操作是否是快速创建任务的正确方法?

【问题讨论】:

  • 不行,您应该进行批量提交以减少 API 调用次数。见*.com/a/34457147/136598
  • 旧的 App Engine 任务队列具有如上所述的异步批处理添加。但是,我不建议您使用旧功能,尤其是如果您已迁移到 Cloud Tasks。
  • @AveriKitsch 是上面的旧方法吗?如果不是这样,你知道如何批量添加任务到队列吗?

标签: python google-app-engine google-cloud-platform google-cloud-tasks


【解决方案1】:
- I am posting this as an answer, due to the amount of text not fitting in a comment.

似乎前面提到的(在 cmets 中)方法:

  • 队列(“someQueue”).add_async(tasks)

确实是一种旧方法。此方法在Task Queue REST API (v1) 中实现,以便将任务或任务列表异步添加到task queue 中。

但是,正如 here 所述,App Engine 任务队列 REST API (v1) 已于 2018 年 2 月 20 日被拒绝。单独的产品 Cloud Tasks 提供了一个 REST API,您可以使用它从第二代 App Engine 标准环境运行时、任何 App Engine 柔性环境运行时,甚至完全来自 App Engine 之外。

此 API包含“add_async()”功能。更具体地说,herehere 确认,作为App Engine SDK have the option to do 的用户,异步添加任务到队列的功能不是通过 Cloud Tasks API 提供的功能。

但是,当需要添加大量云任务(例如数百万或数十亿)时,a double-injection pattern can be useful

要实现此场景,您需要创建一个新的注入器队列,其单个任务将包含添加您正在使用的原始队列的多个 (100) 任务的信息。在这个注入器队列的接收端将是一个服务,它将预期的任务实际添加到您的原始队列中。尽管此服务中的任务添加将是同步的和一对一的,但它会为您的主应用程序提供一个异步接口来批量添加任务。通过这种方式,您可以克服在主应用程序中同步、一对一任务添加的限制。

请注意,500/50/5 模式将任务添加到队列是一种建议方法,以避免任何(队列/目标)过载。

由于我没有找到此实现的任何示例,因此我将在找到答案后立即编辑答案。

我希望这会有所帮助。

【讨论】:

  • 谢谢这真的很丰富。总而言之,我最初的想法似乎朝着正确的方向前进。但我应该改为将其设为一项服务,该服务可以限制并从原始任务列表/队列中接收一批“待创建”任务,但作为一项服务,它也会根据任务数量进行扩展原始队列/列表?
  • 1/2 - 是的。服务/注入器队列可以随着时间的推移加速,例如以 5 TPS 开始,然后每 5 分钟增加 50%。请注意,当扩展超过 500 TPS 时,您应该每 5 分钟增加不超过 50% 的流量。建议遵循 500/50/5 模式的任务添加以避免队列/目标过载。
  • 2/2 - 此外,如果任务是由 App Engine 应用创建的,您可以利用 App Engine 流量拆分(标准/灵活)来平滑流量增长。 Thisthis 链接可能有助于理解场景。