我在 Firebase 函式中使用 Firebase Admin SDK 來列出 Cloud Storage 上目錄的內容。然而,我的函式通常需要超過 5 秒的時間來回答。起初我認為這完全是由于函式本身的冷啟動,我已經嘗試了很多方法來防止函式的冷啟動,例如:
- 設定
minInstances為 1 或更多 - 使用 cronjob 每分鐘呼叫一次函式(無需身份驗證,因此它實際上不使用管理 sdk 但仍保持函式溫暖)
- 將函式拆分為單獨的檔案以減少冷啟動時間(https://stackoverflow.com/a/47985480/13370504)
- 嘗試將函式移近云存盤 (
us-central1toeurope-west3)
但是,上述方法均無效,第一次呼叫該函式時,我的回應時間仍然很慢。在函式中添加了一些日志記錄后,結果表明 Admin SDK 需要一秒鐘以上才能從實時資料庫中獲取單個值,并且getFiles在 Cloud Storage 上運行命令通常需要 5 秒鐘以上(該目錄通常只包含一個單個檔案)。
例如對于下面的代碼,我得到以下控制臺輸出:
listVideos: coldstart true
listVideos: duration 1: 0ms
listVideos: duration 2: 1302ms (realtime database)
listVideos: duration 3: 6505ms (getFiles on cloud storage)
listVideos: coldstart false
listVideos: duration 1: 0ms
listVideos: duration 2: 96ms (realtime database)
listVideos: duration 3: 199ms (getFiles on cloud storage)
我的功能是這樣的:
import * as admin from "firebase-admin";
admin.initializeApp();
let coldStart = true;
exports.listVideos = functions.region("europe-west1").runWith({
memory: "128MB",
minInstances: 1,
}).https.onCall(async (data, context) => {
console.log("coldstart", coldStart);
coldStart = false;
const t1 = new Date().getTime();
if (context.auth) {
const authUid = context.auth.uid;
console.log(`duration 1: ${new Date().getTime() - t1}ms`);
const level = (await admin.database().ref(`users/${authUid}/`).once("value")).val();
console.log(`duration 2: ${new Date().getTime() - t1}ms (realtime database)`);
const [files] = await admin.storage().bucket()
.getFiles({
prefix: `${authUid}/video`,
});
console.log(`duration 3: ${new Date().getTime() - t1}ms (getFiles on cloud storage)`);
return {status: "success", files: files};
} else {
return {status: "error - not authenticated"};
}
});
我知道我不能期望 0 毫秒的延遲,但是對于一個簡單的getFiles呼叫,我期望在 1 秒以內的時間,就像 sdk 處于“熱”狀態時一樣(考慮到我的整個存盤桶少于 1000 個檔案和我所在的目錄) d 串列中只有 1 個檔案)
uj5u.com熱心網友回復:
Cloud Storage 不是資料庫,也沒有針對查詢進行優化(getFiles 實際上是使用物件名稱前綴對整個存盤桶的查詢)。當您已經知道物件的名稱時,它已針對大規模存盤和檢索資料 blob 進行了優化。
如果要快速串列檔案,考慮存盤在資料庫中的檔案的元資料的查詢要執行的型別進行了優化,并根據需要這些記錄鏈接到您的存盤。這是 GCP 專案中相當普遍的做法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/385230.html
標籤:火力基地 火力实时数据库 谷歌云功能 谷歌云存储 firebase-admin
