有没有办法让firebase实时数据库存在系统更快地检测断开连接

Posted

技术标签:

【中文标题】有没有办法让firebase实时数据库存在系统更快地检测断开连接【英文标题】:Is there a way to make the firebase realtime database presence system detect disconnect faster 【发布时间】:2019-10-25 05:38:53 【问题描述】:

我正在创建一个 Flutter 应用程序,必须几乎立即从 realtime/firestore 数据库中检测到用户离线并通知其他用户。

我已经尝试了在实时数据库中订阅 .info/connected 的推荐方法,并且还更新了 Firestore 数据库。

FirebaseDatabase.instance
        .reference()
        .child('.info')
        .child('connected')
        .onValue
        .listen((data) 
      if (data.snapshot.value == false) 
        // Internet has been disconnected
        setState(() 
          state.connected = false;
        );
        userFirestoreRef.updateData(
          'status': 'offline',
          'lastChanged': FieldValue.serverTimestamp(),
        );
      
      userDbRef.onDisconnect().update(
        'status': 'offline',
        'lastChanged': ServerValue.timestamp
      ).then((_) async 
        // This resolves as soon as the server gets the request, not when the user disconnects
        setState(() 
          state.connected = true;
        );
        await userDbRef.update(
          'status': 'online',
          'lastChanged': ServerValue.timestamp,
        ).catchError((e) => debugPrint('Error in realtime db auth, $e'));

        await userFirestoreRef.updateData(
          'status': 'online',
          'lastChanged': FieldValue.serverTimestamp(),
        ).catchError((e) => debugPrint('Error in firestore auth, $e'));
      );

一旦互联网关闭,实时数据库大约需要 1.5 分钟才能检测到用户已断开连接,我希望这个时间最长为 10 秒。

【问题讨论】:

网络中的断开连接总是通过超时实现的。网络包需要时间来遍历网络,被对端处理并返回响应;有时更多,有时更少。由于没有实际“切断”物理电缆,因此只有在对等方在特定时间范围内没有响应时,才能假设“断开”。为了在拥塞的网络和繁忙的对等方之间取得平衡,90 秒是典型的超时值。 嗨,您如何记录用户在应用程序上的存在?很多人说要使用流生成器,但我认为它不正确 您找到解决此问题的方法了吗? 【参考方案1】:

客户端可以通过两种方式断开连接:

完全断开连接,客户端让服务器知道它正在消失。

脏断开,客户端消失,由服务器来检测这种情况。

对于完全断开连接,您定义的 onDisconnect 写入将立即运行。

脏断开取决于套接字超时,这意味着您的onDisconnect 写入发生可能需要几分钟。对于这种行为,您无能为力,因为它是套接字工作方式的固有部分。

如果您想要一种更快的方法来检测哪些客户端仍然连接,您可以在数据库中编写保持活动状态。本质上:每 10 秒从每个客户端写入一个标记值。

【讨论】:

感谢您抽出宝贵时间。这将如何运作?从每个客户端写入一个哨兵值 您只需定期写ServerValue.TIMESTAMP。 firebase.google.com/docs/database/web/…

以上是关于有没有办法让firebase实时数据库存在系统更快地检测断开连接的主要内容,如果未能解决你的问题,请参考以下文章

Android Firebase实时数据库互联网连接[重复]

如何限制用户在 Firebase 实时数据库中上传一定数量的数据

使用Node,EJS和Firebase进行实时数据库模板化

如何检查 Firebase 实时数据库(Dart/Flutter)中是不是存在值?

Android微调器没有显示Firebase实时数据库数据?

有没有办法让这段代码运行得更快