簡體   English   中英

適用於Firebase性能的雲功能

[英]Cloud Functions for Firebase performance

我正在使用Cloud Functions for Firebase:

  1. 從api.ai接收參數
  2. 撥打第三方API和
  3. 回復api.ai.

我對第三方API的調用使用請求Node.js模塊 ,並包含在index.js中的函數( getInfoFromApi() )中。

我遇到的問題是輔助函數調用的執行始終在15-20秒之間。 注意:雲功能本身在400 ms范圍內始終如一地完成執行。

通過將簡單注釋記錄到控制台,我可以看到函數何時啟動,何時調用輔助函數以及何時收到第三方的響應,所以我想我可以看到發生了什么。

粗略地說,時間看起來像這樣:

  • 0:雲函數初始化
  • 400毫秒:雲功能完成
  • 16 s: getInfoFromApi()函數(!)
  • 17 s:第三方API返回結果

我的問題:

  • 是否有明顯的原因導致延遲調用輔助功能? 這似乎不是由冷啟動問題引起的因為雲功能快速恢復生命並且即使在重復呼叫之后延遲也是一致的。
  • 是否使用“請求”節點模塊導致問題? 是否有更好的模塊用於創建/管理來自雲功能的http請求?

你可以在這里看到index.js的簡化要點: https//gist.github.com/anonymous/7e00420cf2623b33b80d88880be04f65

以下是Firebase控制台的示例,其中顯示了示例時間。 注意:輸出與上面的代碼略有不同,因為我簡化了上面的代碼以幫助理解。 在此輸入圖像描述

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

根據我對雲功能的經驗,一旦“執行完成”標志完成,它將導致延遲(從3秒到15秒)。 這會阻止剩余的執行並增加您的總響應時間。

為了解決這個問題,您可以嘗試將Promise放置到第三方調用中,一旦完成,然后執行“response.send()”以結束該功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM