在实时数据库中是否存在类似firestore中onDisconnect()的方法?

时间:2018-03-06 06:42:51

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

我想检查用户的在线状态,在实时数据库中我曾经在onDisconnect()的帮助下检查过,但现在我已转移到firestore并且找不到任何类似的方法就是这样。

4 个答案:

答案 0 :(得分:3)

根据onDisconnect

  

onDisconnect类最常用于管理应用程序中的状态,在这些应用程序中,检测连接的客户端数量以及其他客户端何时断开连接非常有用。

为了能够在firestore中使用存在,您需要将firestore与实时firebase连接(没有别的办法)。

请查看此信息以获取更多信息:

https://firebase.google.com/docs/firestore/solutions/presence

答案 1 :(得分:1)

没有等价物。 Firestore SDK目前没有像Realtime Database SDK那样的状态管理。

相反,您可能希望将实时数据库onDisconnect()与Cloud Functions结合使用,以便在客户端与RTDB断开连接时启动一些工作。你会假设你的应用程序可能同时也失去了与Firestore的连接。

答案 2 :(得分:1)

注意:此解决方案不是特别有效

在我的头顶上(阅读:我没有想过警告),您可以执行以下操作:

const fiveMinutes = 300000 // five minutes, or whatever makes sense for your app

// "maintain connection"
setInterval(() => {
  userPresenceDoc.set({ online: new Date().getTime() })
}, fiveMinutes)

然后,在每个客户端上...

userPresenceDoc.onSnapshot(doc => {
  const fiveMinutesAgo = new Date().getTime() - fiveMinutes
  const isOnline = doc.data().online > fiveMinutesAgo
  setUserPresence(isOnline)
})

您可能希望代码检查存在性的间隔比维护连接以解决网络延迟等的代码所使用的间隔稍大。

有关费用的注释

因此,很明显,当某人断开连接与其他客户端识别该断开连接之间可能会有很大的延迟。您可以通过增加写入Firestore的频率来减少延迟时间,从而增加成本。运行这些数字,假设单个客户端连接连续运行一个月,我得出了不同间隔的以下成本:

Interval     Cost/User/Month
----------------------------
10m          $0.007776
 5m          $0.015552
 1m          $0.07776
10s          $0.46656
 5s          $0.93312
 1s          $4.6656

以一秒钟的间隔运行是非常昂贵的,对于拥有10,000个用户的应用程序一个月开放的系统,每月的费用为46,656美元。如果用户数相同,则间隔10分钟每月只需花费$ 77.76。合理的间隔时间为1分钟,10,000个用户,每个用户每天仅使用4个小时的应用,每月的费用为$ 129.60。

答案 3 :(得分:0)

尝试一下,但是这种方法有点怪异,因为我们不能在Firestore中使用 onDisconnected 。据我所知,实时数据库使用安全的WebSocket技术,这就是为什么onDisconnected拥有它的原因

但是您可以使用for every character position in string (called i): for every character in char (called char1): substitute the character at the current position with char1 #This is done by printing all characters before the current position #(string[:i]), then printing the new character (char1) then printing all #charactrers after the current position (string[i+1:]) 中可以实现的realtime databasecloud functions

update the firestore data

客户端中的某个地方

functions.database.ref('users/{userId}').onUpdate()

在cloudfunctions中(这将在更新时触发)

firebase.database()
  .ref('.info/connected')
  .on('value', async (snap) => {
    if (snap.val() === true) {
      // Update the online status in RTDB 
      await firebase.database()
        .ref(`users/${credentials.user.uid}/`)
        .set({
          online_status: true,
          start_online: firebase.database.ServerValue.TIMESTAMP
        });

      // OnDisconnect
      firebase.database()
        .ref(`users/${credentials.user.uid}/`)
        .onDisconnect()
        .set({
          online_status: false,
          last_online: firebase.database.ServerValue.TIMESTAMP
        });
    }
  });

从云功能更新到Firestore大约需要1或2秒