尽可能缩短firebase/firestore中的操作时间

尽可能缩短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

我使用firebase和firestore构建react本机应用程序。 我想做的是,当用户打开应用程序时,插入/更新他的状态为“在线”(一种状态系统),当用户关闭应用程序时,插入/更新他的状态为“离线”。 我用firebase.database.onDisconnect()完成了这项工作,它工作得很好。 这就是函数

    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)
        })