适用于Firebase性能的云功能

时间:2017-03-21 17:59:00

标签: node.js firebase google-cloud-functions

我正在使用Cloud Functions for Cloudbase:

  1. 从api.ai
  2. 接收参数
  3. 拨打第三方API和
  4. 回复api.ai。
  5. 我对第三方API的调用使用了request Node.js module,并且包含在index.js中的函数(getInfoFromApi())中。

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

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

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

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

    我的问题:

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

    您可以在此处查看index.js的简化要点:https://gist.github.com/anonymous/7e00420cf2623b33b80d88880be04f65

    以下是Firebase控制台的示例,其中显示了示例时间。注意:输出与上面的代码略有不同,因为我简化了上面的代码以帮助理解。 enter image description here

2 个答案:

答案 0 :(得分:1)

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

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

我无法从要点中分辨出您正在尝试做什么 - 它实际上似乎没有对第三方结果做任何事情,并且可能不是您的用例的真实情况。但是这样的事情可能就是你想要的:

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(...);
          // ....
       });
  });
}

答案 1 :(得分:0)

根据我对云功能的体验,一旦“执行完成”标志完成,它将导致延迟(从3秒到15秒)。这会阻止剩余的执行并增加您的总响应时间。

为了解决这个问题,你可以尝试在你的第三方通话中设置一个Promise,一旦完成,然后执行“response.send()”,结束这个功能。