野狗 Sync 离线事件的最佳实践方案

822 阅读3分钟
原文链接: mp.weixin.qq.com

想要弄清什么是离线事件的最佳实践方案,我们需要先了解些基本概念。

01-

基本概念

什么是离线功能

离线功能让应用在无网环境下仍可以操作数据。它包括离线事件、监控连接状态等特性。

什么是离线事件

离线事件是云端与客户端断开连接时自动触发的事件。

断开连接包括客户端主动断开连接,或者意外的网络中断。触发事件即执行特定的数据操作,它支持离线写入,更新和删除数据方法。

02-

离线事件为一次性

一次性是指离线事件每注册一次,只触发一次。

正常情况下,客户端在线时会在初始化过程中注册离线事件,客户端离线时离线事件触发;客户端再次上线,在初始化连接时再次注册离线事件,此时离线事件可以正常工作。

异常情况下,如网络意外中断,客户端不会重新初始化连接,离线事件不会重新注册。因此云端只会在第一次异常断连时触发离线事件。网络恢复后,客户端与云端自动重连,但不会重新注册离线事件,此时连接再次断开(客户端主动退出或再次网络中断),离线事件不会再次触发。

为避免上述情况,可通过手动重新注册离线事件,保证异常断连时,离线事件也能触发。

03-

最佳实践方案:手动注册离线事件

通过 离线事件监听连接状态 配合使用,将离线事件的注册代码放到监听连接状态的回调函数中,可实现异常情况下离线事件的重新注册:

var config = {
  authDomain: ".wilddog.com",
  syncURL: "https://.wilddogio.com"
};
wilddog.initializeApp(config);
// 监听连接状态
var connectedRef = wilddog.sync().ref("/.info/connected");
connectedRef.on("value", function(snap) {
  if (snap.val() === true) {
    console.log("connected");
    // 当连接成功时,重新注册离线事件
    var presenceRef = wilddog.sync().ref("disconnectmessage");
    presenceRef.onDisconnect().set("I disconnected!");
  } else {
    console.log("not connected");
  }
});

04-

修正在线状态不一致

因网络中断断连时,可能出现客户端实际的在线状态与云端记录不一致的情况。如下所示:

  • 1.客户端与野狗服务器 A 连接;

  • 2.客户端与野狗服务器 A 因网络异常,中断连接;

  • 3.客户端检测连接断开后,未等待 SDK 自动重连,也未等待心跳超时关闭连接,立刻与野狗服务器 B 建立新连接,并写入数据 1;

  • 4.服务器 A 检测连接超时触发离线事件,离线事件执行操作,将数据修改为 2 ,与服务器 B 冲突。

此时,客户端实际在线,但云端被标记为该客户端离线。

因此,建议在代码中增加监听云端在线状态的节点。如出现上述情况:云端在线状态与当前实际的在线状态不一致,可及时修正。

例如,节点 /user-status 下记录着所有客户端的在线状态,客户端在线状态为 online,客户端离线状态则为 offline:

// 记录客户端在线状态的节点
var onlineRef = wilddog.sync().ref("/users/status");
// 客户端在线,将状态更改为 online(具体逻辑省略)
onlineRef.child(uid).set("online");
// 注册离线事件:客户端离线时,将状态更改为 offline(具体逻辑省略)
onlineRef.child(uid).onDisconnect().set("offline");

通过增加监听云端在线状态的代码,及时修正状态不一致的情况:

onlineRef.child(uid).on("value", function(snap) {
  if (snap.val() === "online") {
    console.log("current user online");
  } else if (snap.val() === "offline") {
    console.log("current user offline");
    // 一旦监听到当前用户是离线状态,但实际上是在线状态,则修正用户的在线状态
    onlineRef.child(uid).set("online");
  } else {
    console.log("other status");
  }
});

05-

完整实践方案

完整实践方案可参考野狗官方文档:

https://docs.wilddog.com/guide/sync/bestpractice/offline.html

✦ ✦ ✦ ✦ ✦ ✦ ✦ ✦

实时数据同步 Sync 是野狗的核心实时通信引擎。采用“本地处理、云端同步”的架构,可以构建丰富的实时通信场景。


点击“阅读原文

了解野狗

↓↓↓