我撰寫了以下由位置 /test/{folder} 中的寫入觸發的云函式 writetest
函式 writetest 只是在位置 /register/{folder} 中寫入函式被觸發的(近似)時間。
我們可以在下面看到 html 檔案 testfirebase.html(我洗掉了我的專案的資訊)。當您在瀏覽器中加載此 html 時,首先登錄應用程式,然后單擊“上傳”按鈕后,您在 100 個不同位置 /test/0、/test/1、/test/2 上傳 1KB 資料 100 次, ...,/測驗/99。
當然這會觸發云函式 writetest 100 次。我的問題是,這也會在專案控制臺的使用選項卡中生成超過 80 個連接,特別是在專案控制臺的“使用”選項卡中,您可以看到大約 440KB 的下載資料。對我來說,完全有下載資料是令人驚訝的,更令人驚訝的是,下載的資料比上傳的資料大很多倍。也許這與每個連接中的 3.5Kb“握手”有關?由于我的真實應用程式非常頻繁地進行這些上傳,并且每次上傳都非常小(~1KB),這會顯著增加使用由寫入觸發的云功能的成本。這種額外的費用是不可避免的嗎?
這是云函式的代碼
exports.writetest = functions.database.ref(
"/test/{folder}")
.onWrite(async (snapshot, context)=> {
return admin.database().ref("/register/"
context.params.folder).update(
{
"time": admin.database.ServerValue.TIMESTAMP});
});
html 檔案 testfirebase.html(您必須使用授權在 /test/ 中寫入的用戶登錄)
<html lang="en">
<head>
<script src=
"https://www.gstatic.com/firebasejs/8.7.0/firebase.js">
</script>
<script src="https://www.gstatic.com/firebasejs/ui/6.0.1/firebase-ui-auth.js"></script>
<link type="text/css" rel="stylesheet" href="https://www.gstatic.com/firebasejs/ui/6.0.1/firebase-ui-auth.css" />
<script>
const firebaseConfig = {
apiKey: "XX",
authDomain: "XX.firebaseapp.com",
databaseURL: "https://XX-default-rtdb.firebaseio.com",
projectId: "XX",
storageBucket: "XX.appspot.com",
messagingSenderId: "XX",
appId: "XX",
measurementId: "${config.measurementId}"
};
// Initialize Firebase
firebase.initializeApp(firebaseConfig);
var ui = new firebaseui.auth.AuthUI(firebase.auth());
var dbase=firebase.database();
const uiConfig = {
callbacks: {
signInSuccessWithAuthResult(authResult, redirectUrl) {
return true;
},
uiShown() {
},
},
signInFlow: 'popup',
signInSuccessUrl: 'https://mydomain.app/testfirebase.html',
signInOptions: [
firebase.auth.EmailAuthProvider.PROVIDER_ID,
firebase.auth.GoogleAuthProvider.PROVIDER_ID,
],
};
firebase.auth().onAuthStateChanged( async (user) => {
if (user) {
console.log("user logged");
console.log("user id:" user.uid);
} else {
console.log("no user logged");
ui.start('#firebaseui-auth-container', uiConfig);
}
});
async function dbset(path,data)
{
return new Promise ((resolve,reject)=>{
var reference = dbase.ref(path);
reference.set(data).then(()=>{resolve("OK"); console.log("OK");}).catch((error) => {
reject("ERROR DBSET:" error);
});
});
}
async function upload()
{
var onekbytestring="";
for (let k=0;k< 1000;k ) {onekbytestring = onekbytestring "1";}
for (let j=0; j< 100;j )
{
dbset("test/" j,{b:onekbytestring });
}
}
</script>
</head>
<body>
<div id="firebaseui-auth-container"></div>
<div >
<button onclick="upload()">Upload</button>
</div>
</body>
</html>
uj5u.com熱心網友回復:
呼叫update路徑不會從該路徑下載資料path。
但由于您使用 Admin SDK,它需要通過 HTTPS 與服務器建立連接 Web 套接字連接,其中包括用于建立 TLS/SSL 連接的大約 4Kb 開銷。
由于這些客戶端連接,每一個也將算作一個連接。這些連接可能會在服務器上停留幾分鐘,同時等待套接字超時。如果發生這種情況,您還將在控制臺中看到這些連接。
請注意,在實際用例中,連接可能會更加分散。在這種情況下,我希望您會看到更多重用已建立的連接,因為呼叫更有可能命中之前已使用的 Cloud Functions 實體,因此 SDK 可能仍具有已建立的連接。
您可以嘗試使用 REST API 發送更新,看看是否有任何不同。雖然這肯定會減少連接數(因為用于更新的 REST API 是無連接的),但我懷疑它會對資料大小產生很大影響。不過,如果這對您來說是一個問題,那么它可能值得一試。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/443569.html
標籤:节点.js 火力基地 firebase-实时数据库 谷歌云功能
