从 GCP HTTP 函数调用启动后台进程的最佳方法?

Posted

技术标签:

【中文标题】从 GCP HTTP 函数调用启动后台进程的最佳方法?【英文标题】:Best way to start a background process from GCP HTTP function call? 【发布时间】:2021-09-26 07:40:16 【问题描述】:

所以,根据这里的文档https://cloud.google.com/functions/docs/writing/http

终止 HTTP 函数 如果函数创建后台任务(例如线程、期货、Node.js Promise 对象、回调或系统进程),您必须在返回 HTTP 响应之前终止或以其他方式解决这些任务。任何未在 HTTP 响应之前终止的任务都可能无法完成,也可能导致未定义的行为。

因此,如果需要从 HTTP 函数中启动一个长时间运行的后台任务,但仍能快速从函数返回,则没有直接的方法。

已经尝试过 PubSub 方法(调用 await topic.publishJSON(pars)),但看起来发布主题非常耗时 - 需要 2-3 秒。 (8-)

那么可能 pubsub 触发功能运行良好,但是这 2-3 秒的延迟使其无用。

P.S.:使用从内部函数启动 Promise 的方法实际上是有效的,但听起来很容易出错,因为它违反了文档。

【问题讨论】:

您是否考虑过将请求写入 Firestore/RTDB 并从中触发后台任务? 【参考方案1】:

如果您需要快速回答,您有两种解决方案

异步

使用 Cloud Functions,您需要调用(执行 HTTP 调用)另一个函数(或 Cloud Run 或 App Engine),而无需等待答案,并回复给请求者。您执行的呼叫将在后台运行,并回答您的云功能不再收听的内容! 对于 PubSub,情况类似。您无需调用 Cloud Functions(或 Cloud Run 或 App Engine),而是将消息发布到 PubSub 主题中。然后创建订阅以调用您长期运行的进程 与 Cloud Task 的想法相同,但您在队列中创建一个任务

同步

如果您使用 Cloud Run 而不是 Cloud Functions,您可以对请求者执行部分答复。像这样,您可以立即向请求者回复一个“OK”的部分响应,并在请求上下文中继续该过程,并在需要时发送另一个部分响应,或者在长时间运行的过程结束时通知请求者用户结束他们的进程。

【讨论】:

非常感谢您给了我 4 个不同的想法。使用 PubSub 的异步方法 #2 - 如您所见,这是我已经尝试过的。而且时机一点都不好。关于方法#1 - 我所有的函数都是可调用的,所以不确定它是否可行,你还必须将“长时间运行”的代码段作为函数处理(只是为了从另一个函数调用它),而且你有限制像 300 秒最大超时。关于 Cloud Run - 看起来很有趣 - 只是调查一下。会更新。

以上是关于从 GCP HTTP 函数调用启动后台进程的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

无法从 GCP 调度程序调用 Google Cloud Function

将 PHP 代码从 github 部署/重新部署到 GCP Compute Engine LAMP Stack 的最佳方式 [Google 点击部署]

GCP 中的流式处理抓取的音频

如何从 GCP 函数 GUI 调用 PubSub 函数

我如何制作一个启动Python脚本的linux后台进程(在c中)

HapiJS 启动更长的后台进程