【问题标题】:minimize time operation in firebase/firestore最小化firebase/firestore中的操作时间
【发布时间】:2018-09-28 22:07:32
【问题描述】:

我使用 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 秒)

    module.exports.onUserStatusChanged = functions.database
  .ref('/UserStatus/{uid}').onUpdate((change,context) => {
    const eventStatus = change.after.val();


    const userStatusFirestoreRef = firestore.doc(`UserStatus/${context.params.uid}`);


return change.after.ref.once("value").then((statusSnapshot) => {
  return statusSnapshot.val();
}).then((status) => {
  console.log(status, eventStatus);
  if (status.last_changed > eventStatus.last_changed) return status;

  eventStatus.last_changed = new Date(eventStatus.last_changed);

  //return userStatusFirestoreRef.set(eventStatus);
  return userStatusFirestoreRef.set(eventStatus,{merge:true});
    });
  });

然后,我想计算应用程序中的在线用户,所以我在将新数据写入firestore节点时确实触发了它通过查询计算在线用户的大小。(它工作正常但需要4-7秒)

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

所有操作大约需要 12 秒。这对我来说太多了,它是在线应用程序

我的火力基地结构 我做错了什么?可能有什么不必要的功能什么的?

我的最终目标:

  1. 尽量减少操作时间。
  2. 获取在线用户数(使用 listener-each 更改,它将在应用程序中更新)
  3. 更新用户状态。

如果有其他方法可以做到这一点,我很想知道。

【问题讨论】:

    标签: firebase firebase-realtime-database google-cloud-firestore


    【解决方案1】:

    Cloud Functions 进入“冷启动”模式,需要一些时间才能启动。这是我能想到需要那么长的唯一原因。 Stack Overflow: Firebase Cloud Functions Is Very Slow

    但是您的云功能只需要在注销时写入 Firestore 抓住用户关闭应用程序的情况。您可以在从客户端登录时直接写入它 auth().onAuthStateChange()

    您也可以直接从 实时数据库并将 Firestore 用于您的其余数据。

    您可以重新排列您的数据,以便拥有一个仅包含在线用户的“OnlineUsers”集合而不是“UserStatus”集合,并通过在注销时删除文档来保持同步。然后它不需要查询操作来获取它们。查询对您的性能的影响可能很小,但如果有大量用户,这会更好。

    该文档还有一个可能有用的指南:Firebase Docs: Build Presence in Cloud Firestore

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 2022-01-10
      • 2018-07-04
      • 1970-01-01
      相关资源
      最近更新 更多