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

Call cloud functions without waiting for response

在这里尝试使用云函数进行一些破解,但似乎无法弄清楚问题所在。

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

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

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

}

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

您的问题的摘要似乎是,当您调用 Cloud Functions 时,您希望它能够 return 向其调用者提供一个值,同时执行后台工作,例如调用另一个服务并等待寻求回应。

当您 return 向 Cloud Functions 的调用者提供一个值时,即是 Cloud Functions 生命周期的结束。 return.

之外的云函数中的任何一种 life 都不能保证

这已记录在案 here

正文(部分)如下:

A function has access to the resources requested (CPU and memory) only for the duration of function execution. Code run outside of the execution period is not guaranteed to execute, and it can be stopped at any time. Therefore, you should always signal the end of your function execution correctly and avoid running any code beyond it.

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

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

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

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

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