尽可能缩短firebase/firestore中的操作时间
我使用firebase和firestore构建react本机应用程序。 我想做的是,当用户打开应用程序时,插入/更新他的状态为“在线”(一种状态系统),当用户关闭应用程序时,插入/更新他的状态为“离线”。 我用firebase.database.onDisconnect()完成了这项工作,它工作得很好。 这就是函数尽可能缩短firebase/firestore中的操作时间,firebase,firebase-realtime-database,google-cloud-firestore,Firebase,Firebase Realtime Database,Google Cloud Firestore,我使用firebase和firestore构建react本机应用程序。 我想做的是,当用户打开应用程序时,插入/更新他的状态为“在线”(一种状态系统),当用户关闭应用程序时,插入/更新他的状态为“离线”。 我用firebase.database.onDisconnect()完成了这项工作,它工作得很好。 这就是函数 async signupAnonymous() { const user = await firebase.auth().signInAnonymouslyAndRe
async signupAnonymous() {
const user = await firebase.auth().signInAnonymouslyAndRetrieveData();
this.uid = firebase.auth().currentUser.uid
this.userStatusDatabaseRef = firebase.database().ref(`UserStatus/${this.uid}`);
this.userStatusFirestoreRef = firebase.firestore().doc(`UserStatus/${this.uid}`);
firebase.database().ref('.info/connected').on('value', async connected => {
if (connected.val() === false) {
// this.userStatusFirestoreRef.set({ state: 'offline', last_changed: firebase.firestore.FieldValue.serverTimestamp()},{merge:true});
return;
}
await firebase.database().ref(`UserStatus/${this.uid}`).onDisconnect().set({ state: 'offline', last_changed: firebase.firestore.FieldValue.serverTimestamp() },{merge:true});
this.userStatusDatabaseRef.set({ state: 'online', last_changed: firebase.firestore.FieldValue.serverTimestamp() },{merge:true});
// this.userStatusFirestoreRef.set({ state: 'online',last_changed: firebase.firestore.FieldValue.serverTimestamp() },{merge:true});
});
}
在那之后,我触发将数据插入firestore(因为我想使用firestore),这就是函数(工作正常,但需要3-4秒)
然后,我想计算应用程序中的在线用户,所以我在向firestore的节点写入新数据时触发了该操作,这样它就可以通过查询计算在线用户的大小。(它工作正常,但需要4-7秒)
然后进入我的本地应用程序
我得到了在线用户的数量
this.unsubscribe = firebase.firestore().doc(`Counters/onlineUsersCounter`).onSnapshot(doc=>{
console.log('count',doc.data().count)
})
所有操作大约需要12秒。这对我来说太多了,这是一个在线应用程序
我的火基结构
我做错了什么?也许有不必要的功能或什么
我的最终目标:
如果还有其他方法,我很想知道。云功能进入“冷启动”模式,需要一些时间才能启动。这是我唯一能想到的需要这么长时间的原因 但您的云功能只需要在注销到时写入Firestore即可 捕捉用户关闭应用程序的情况。您可以在从客户端登录时直接对其进行写入 使用
auth().onAuthStateChange()
您也可以随时直接从数据库中读取登录或注销的用户
实时数据库,其余数据使用Firestore
您可以重新排列数据,使“OnlineUsers”集合不再是“UserStatus”集合,而是只包含在线用户的“OnlineUsers”集合,通过在注销时删除文档来保持同步。这样就不需要查询操作来获取它们。查询对性能的影响可能很小,但如果有大量用户,则性能会更好
文档中还有一个可能有用的指南:云功能进入“冷启动”模式,需要一些时间才能启动。这是我唯一能想到的需要这么长时间的原因 但您的云功能只需要在注销到时写入Firestore即可 捕捉用户关闭应用程序的情况。您可以在从客户端登录时直接对其进行写入 使用
auth().onAuthStateChange()
您也可以随时直接从数据库中读取登录或注销的用户
实时数据库,其余数据使用Firestore
您可以重新排列数据,使“OnlineUsers”集合不再是“UserStatus”集合,而是只包含在线用户的“OnlineUsers”集合,通过在注销时删除文档来保持同步。这样就不需要查询操作来获取它们。查询对性能的影响可能很小,但如果有大量用户,则性能会更好
本文档还提供了一个可能有用的指南:
module.exports.countOnlineUsers = functions.firestore.document('/UserStatus/{uid}').onWrite((change,context) => {
console.log('userStatus')
const userOnlineCounterRef = firestore.doc('Counters/onlineUsersCounter');
const docRef = firestore.collection('UserStatus').where('state','==','online').get().then(e=>{
let count = e.size;
console.log('count',count)
return userOnlineCounterRef.update({count})
})
return Promise.resolve({success:'added'})
})
this.unsubscribe = firebase.firestore().doc(`Counters/onlineUsersCounter`).onSnapshot(doc=>{
console.log('count',doc.data().count)
})