无需等待响应即可调用云函数

Jud*_*des 3 javascript node.js typescript google-cloud-functions vercel

在这里尝试使用云功能进行一些小技巧,但似乎无法弄清楚问题是什么。

我目前正在使用 now.sh 来托管无服务器函数,并希望从另一个函数调用 1 个函数。假设我声明了 2 个函数fetchData& setDatasetData调用该fetchData函数时,它会处理一些数据,然后调用该函数。

export const setData = async (req: Request, res: Response) => {
  await axios.post(
    fetchDataEndpointUrl,
    {
      params: {
        key,
      },
    },
  );

  return res.json({
    payload: true,
  });

}
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常,但完成整个操作所需的时间将是 setData 函数调用 + 完成 fetchData 函数调用所需的时间。我想要做的是调用 ,fetchData而不必等待它完成基本上删除awaitaxios 调用中的 。我试过删除,await但当通话结束时setData通话突然结束。有没有办法解耦这个动作而不必等待setData函数完成?

Kol*_*ban 7

您的问题的总结似乎是,当您调用 Cloud Function 时,您希望它能够向其调用者返回一个值,同时执行后台工作,例如调用另一个服务并等待响应。

当您向 Cloud Function 的调用方返回一个值时,即 Cloud Function 的生命周期结束。在返回之外,您无法确保Cloud Function 中的任何一种生活

在此处记录

正文(部分)如下:

函数只能在函数执行期间访问请求的资源(CPU 和内存)。在执行周期之外运行的代码不能保证执行,并且可以随时停止。因此,您应该始终正确地发出函数执行结束的信号,并避免运行超出它的任何代码。

问题的另一部分是,如果我们想让我们的 Cloud Function 进行异步 REST 调用,而我们不关心等待响应,该怎么办。我们可以在不等待嵌套 REST 调用完成的情况下从 Cloud Function 返回吗?

答案是可能,但这取决于被调用的服务的性质以及我们如何调用它。要了解其中的细微差别,请记住 JavaScript 是一种单线程语言。没有多个执行线程。在我们的 JavaScript 应用程序中,一次只会发生一件事。如果我们进行异步 REST 调用并且不关心回复但(显然)关心请求是否已发送,那么我们需要在终止 Cloud Function 之前同步发送请求。如果我们开始使用库包而不深入研究它们的性质,这可能会变得棘手。例如,REST 调用可能包括:

  • 到伙伴的套接字连接
  • 出站请求的传输
  • 收到响应时的回调

在结束顶级 Cloud Function 调用之前,我们需要绝对确定传输已经发生。此外,如果我们确实结束了顶级 Cloud Function 调用,那很可能会减少用于响应的套接字。这可能会导致被调用的 REST 服务出现异常,该服务现在无法返回其 200 响应。

为了在我们不需要也不想等待响应的地方运行工作,GCP 为此提供了一个架构化的解决方案。它被称为“云任务”(请参阅云任务)。在您的 Cloud Functions 中,您将定义一个请求以异步调用您的嵌套服务,并将该请求交给 Cloud Tasks 来执行。Cloud Tasks 会确认收到执行请求,您现在可以确信它会并且可以在最高级别返回。