有没有办法让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 实时数据库中上传一定数量的数据
如何检查 Firebase 实时数据库(Dart/Flutter)中是不是存在值?