![](/img/trans.png)
[英]Firestore Query performance issue on Firebase Cloud Functions
[英]Cloud Functions for Firebase performance
我正在使用Cloud Functions for Firebase:
我對第三方API的調用使用請求Node.js模塊 ,並包含在index.js中的函數( getInfoFromApi()
)中。
我遇到的問題是輔助函數調用的執行始終在15-20秒之間。 注意:雲功能本身在400 ms范圍內始終如一地完成執行。
通過將簡單注釋記錄到控制台,我可以看到函數何時啟動,何時調用輔助函數以及何時收到第三方的響應,所以我想我可以看到發生了什么。
粗略地說,時間看起來像這樣:
getInfoFromApi()
函數(!) 我的問題:
你可以在這里看到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.