适用于Firebase性能的云功能

Jam*_*mes 5 node.js firebase google-cloud-functions

我正在使用Cloud Functions for Firebase:

  1. 从api.ai接收参数
  2. 拨打第三方API和
  3. 回复api.ai.

我对第三方API的调用使用请求Node.js模块,并包含getInfoFromApi()在index.js中的function()中.

我遇到的问题是辅助函数调用的执行始终在15-20秒之间.注意:云功能本身在400 ms范围内始终如一地完成执行.

通过将简单的注释记录到控制台,我可以看到函数何时启动,何时调用辅助函数以及何时收到第三方的响应,所以我想我可以看到发生了什么.

粗略地说,时间看起来像这样:

  • 0:云函数初始化
  • 400毫秒:云功能完成
  • 16 s:getInfoFromApi()调用函数(!)
  • 17 s:第三方API返回结果

我的问题:

  • 是否有明显的原因导致延迟调用辅助功能?这似乎不是由冷启动问题引起的,因为云功能快速恢复生命并且即使在重复呼叫之后延迟也是一致的.
  • 是否使用"请求"节点模块导致问题?是否有更好的模块用于创建/管理来自云功能的http请求?

你可以在这里看到index.js的简化要点:https://gist.github.com/anonymous/7e00420cf2623b33b80d88880be04f65

以下是Firebase控制台的示例,其中显示了示例时间.注意:输出与上面的代码略有不同,因为我简化了上面的代码以帮助理解. 在此输入图像描述

Kat*_*ato 1

getInfoFrom3rdParty()调用是一个异步事件。但是,您尚未从函数返回承诺,因此 Functions 不会等待异步事件完成。

在我看来,由于您返回未定义,该函数也假设它失败并重试。在重试过程中的某个时刻,异步事件可能在函数退出之前完成(即由于竞争条件而意外成功)。我在其他情况下看到了类似的结果,即用户没有在其函数中返回承诺或值。

我无法从要点中看出你想要做什么——它似乎实际上对第三方结果没有做任何事情,并且可能不是你的用例的现实 mcve。但这样的东西可能就是你想要的:

exports.getInfo = functions.https.onRequest((request, response) => {
  // ....

  // NOTE THE RETURN; MOST IMPORTANT PART OF THIS SAMPLE
  return getInfoFromThirdParty(...).then(() => {
    response.writeHead(200, {"Content-Type": "application/json"});
    response.end(JSON.stringify(payload));
  }).catch(e => /* write error to response */);
});

function getInfoFrom3rdParty(food) {
  reqObj.body = '{"query": "'+food+'"}';

  return new Promise((resolve, reject) => {
       mainRequest(reqObj, function (error, response, body) {
          // ....
          if( error ) reject(error);
          else resolve(...);
          // ....
       });
  });
}
Run Code Online (Sandbox Code Playgroud)