当前位置: 首页 > 面试题库 >

有没有一种方法可以使Firebase实时数据库存在系统更快地检测到断开连接

叶华皓
2023-03-14
问题内容

我正在创建一个Flutter应用程序,几乎立即从实时/ 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秒。


问题答案:

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

  • 干净的断开连接,客户端让服务器知道它正在消失。

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

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

肮脏的断开连接取决于套接字超时,这意味着可能要花费几分钟才能进行onDisconnect写操作。对于此行为,您无能为力,因为它是套接字工作方式的固有部分。

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



 类似资料:
  • 问题内容: 我正在寻找一种创建简单的HTML表的方法,该表可以在数据库更改事件发生时进行实时更新。特别是添加了新记录。 换句话说,将其视为执行人员仪表板。如果进行了销售并且在数据库中添加了新行(在本例中为MySQL),则网页应使用新行“刷新”表。 我已经看到了有关新用法的一些信息,但是所有示例都将Coldfusion用作“推动者”,而不是“消费者”。我想让Coldfusion既将事件更新/推送到网

  • 问题内容: 我们有一个SQL联系人数据库,可以无数次链接到我们所有的项目信息中。 最近建议我们将这些信息的联系人部分提供给最终用户的电子邮件客户端,因此我们正在考虑设置LDAP服务器。 有没有可以让我们将数据库中的信息(可能是我怀疑的视图)映射到LDAP服务器的信息? 问题答案: OpenLDAP支持使用back- sql 由元数据驱动的SQL后端。测试的状态因您选择的RDBMS后端而异。

  • 问题内容: 我正在建立一个带有flask的网站,其中用户具有帐户并能够登录。我正在使用flask-principal作为登录部分和角色管理。有没有办法让用户的会话在5分钟或10分钟后过期?我在flask文档或flask-principal文档中找不到该文件。 我想到了一种手动方法,在登录时在服务器端设置一个带有时间标签的变量,并在用户执行下一个操作时,服务器会验证该时间戳记上的时间增量并删除会话。

  • 在执行应用程序检查后,我的firebase实时数据库在我的unity应用程序中无法工作。在firebase应用程序检查功能之前,它完全可以正常工作。但现在,当我试图保存数据时,它拒绝了我的数据库请求,当我在app check monitor中监视我的实时数据库时,它显示我的请求没有包含app check令牌: 这可能是因为您正在使用旧的firebase SDK,其中应用程序检查位于应用程序内部 我

  • 问题内容: 当selectedOption的值更改时,我想调用一个函数。在SwiftUI中,有没有一种类似于编辑TextField的方法? 具体来说,我想在用户更改selectedOption时保存选择的选项。 这是我的选择器: 我仍然是SwiftUI的新手,希望获得一些帮助。谢谢! 问题答案: 如果在视图中使用@State值,则不需要多余的变量 如果需要对@State进行单独的操作,最简单的方法

  • 问题内容: 我正在使用Mosquitto MQTT代理,并且希望将每个发布的消息存储到MySQL数据库中,而无需创建客户端和订阅#通配符。 我发现了这个https://github.com/jpmens/mosquitto-auth- plug, 但是我的英语不够好,无法完全理解它…我认为这只是存储持久性消息,以便代理稍后再发送。我对吗 ? 谢谢 问题答案: mosquitto-auth-plug

  • 问题内容: 如果通过创建缓冲区,则该内存将位于Java堆之外。有没有一种方法可以以跨平台的方式测量应用程序中此类内存的使用情况,类似于我可以使用and 来测量Java堆使用情况的方法? 问题答案: 您可以使用反射来获取Java 7的OpenJDK / HotSpot。没有独立于平台的方式,它仅通过ByteBuffer.allocateDirect()向您显示用法,而没有其他分配本地内存的方式。 另

  • 问题内容: 有谁知道我可以使用node.js读取文件元数据的方法吗?对于 例如,我想读的“细节” jpeg格式的选项卡上的“注释”属性 的文件(在Windows计算机上)。 问题答案: 有许多NPM包可用于读取EXIF数据。例如: