共计 3249 个字符,预计需要花费 9 分钟才能阅读完成。
3 月底公布的 OpenAtom OpenHarmony(以下简称“OpenHarmony”)3.1 Release 版本中,新增了分布式数据对象个性。什么是分布式数据对象呢?本期就让咱们一起来理解一下~
一、背景介绍
OpenHarmony 作为分布式操作系统,反对运行在不同的终端设备上。这些终端设备通过跨端迁徙和多端协同等,能够为用户提供丰盛、晦涩的全场景体验。在这种分布式场景下,不同设施之间须要进行数据互通来实现设施间的配合。
上面先看以下这个分布式场景的示例:
示例:可触屏和 TV 的合作
在 TV/PAD 上观看视频时,在可触屏设施上管制 TV/PAD 上的播放状态、进度、音量和速度等,实现多端管制。
要实现下面这个示例的性能,首先必须实现设施之间的数据同步。传统形式下,设施之间的数据同步,须要开发者实现音讯解决逻辑,包含:建设通信链接、音讯收发解决、谬误重试、数据抵触解决等操作,工作量十分大。而且设施越多,调试复杂度将呈指数增长。是否有更简略的实现形式?通过剖析,咱们发现,示例中的播放状态、进度、音量和速度等其实都是变量。如果这些变量反对“全局”拜访,那么开发者跨设施拜访这些变量就能像操作本地变量一样,数据就可能主动高效、便捷地实现多端同步了。
为此,本次 OpenHarmony v3.1 Release 版本新增了分布式数据对象个性。分布式数据对象为开发者在分布式应用场景下提供简略易用的 JS 接口,轻松实现多设施间同利用的数据协同,同时设施间能够监听对象的状态和数据变更。与传统形式相比,分布式数据对象大大减少了开发者的工作量。
(为不便形容,后文中“分布式数据对象”也简称为“对象”。)
二、原理解析
这么简略高效的分布式数据对象技术具体如何实现的呢?让咱们来一一解析~
1. 对象的数据同步
分布式数据对象,最重要的性能就是对象之间的数据同步。可信组网内的设施能够在本地创立分布式数据对象,并设置 sessionID。不同设施上的分布式数据对象,通过设置雷同的 sessionID,建设对象之间的同步关系。
如图 3 所示,设施 A 和设施 B 上的“分布式数据对象 1”,其 sessionID 均为 session1,这两个对象建设了 session1 的同步关系。
一个同步关系中,一个设施只能有一个对象退出。比方图 3 中,设施 A 的“分布式数据对象 1”曾经退出了 session1 的同步关系,所以,设施 A 的“分布式数据对象 2”就退出失败了。
建设同步关系后,每个 session 有一份共享对象数据。退出了同一个 session 的对象,反对以下操作:
1. 读取 / 批改 session 中的数据。
2. 监听数据变更,感知其余对象对共享对象数据的批改。
3. 监听状态变更,感知其余对象的退出和来到。
对于分布式数据对象的数据同步,值得注意的是,同步的最小单位是“属性”。比方,图 4 中对象 1 蕴含三个属性:name、age 和 parents。当其中一个属性变更时,则数据同步时只需同步此变更的属性。
2. 对象的生命周期
接下来,咱们从生命周期的角度来全面认识一下分布式数据对象。
如图 5 所示,对象包含三种状态:未初始化、本地对象和分布式对象。这三种状态阐明如下:
依据条件变动,对象在这三种状态之间会来回切换:
最开始,对象处于未初始化状态。实例化之后,对象就从未初始化状态切换到本地对象状态。给对象设置 sessionID,收到对端设施对象上线告诉后,此时能够跨设施同步数据了,对象就进入了分布式对象状态。
本端或远端设施下线,或者 sessionID 被革除,那么对象又切回本地对象状态。分布式对象实例和对应的内存数据库都保留在应用程序的过程空间,当应用程序退出后,分布式对象和内存数据库也随之销毁,对象间接进入未初始化状态。
三、开发束缚及案例
通过下面的介绍,大家对分布式数据对象曾经有了充沛的理解了,上面就要介绍开发者们最关怀的“怎么用”的问题了。
在应用分布式数据对象之前,咱们先阐明一下相干的开发束缚:
- 单个应用程序最多只能创立 16 个分布式数据对象实例。
- 思考到性能和用户体验,最多不超过 3 个设施进行数据协同。
- 思考到性能和用户体验,分布式数据对象大小限度在 500KB 以内。
- 分布式数据对象的数据同步产生在同一个应用程序下,且同 session ID 之间。
接下来,咱们通过一个简略的开发案例来解说如何应用分布式数据对象。此案例中,设施 A 和设施 B 别离创立一个蕴含 3 个属性的对象,这两个对象退出到同一个 session,建设同步关系。一个对象的属性变更会主动同步到另一个对象,从而实现“全局变量”成果。
通过此案例,咱们可能把握分布式数据对象的基本操作,包含:
(1). 创建对象
(2). 设置 sessionID
(3). 设置监听对象变更的回调
(4). 监听状态变更
代码示例如下:
- 设施 A 的 JS 代码示例:
import distributedObject from '@ohos.data.distributedDataObject'
// 创建对象,对象蕴含三个属性:name、age 和 isVis
var g_object = distributedObject.createDistributedObject({name:"Amy",
age:18, isVis:false});
// 设置 sessionID 为“123456”g_object.setSessionId("123456");
// 设置监听对象变更的回调
changeCallback : function (sessionId, changeData) {if (changeData != null && changeData != undefined) {
changeData.forEach(element => {console.info("changed !" + element + " " + g_object[element]);
});
}
}
g_object.on("change", this.changeCallback);
- 设施 B 的 JS 代码示例:
// 创建对象,对象蕴含三个属性:name、age 和 isVis
var g_object = distributedObject.createDistributedObject({name:"Amy",
age:undefined, isVis:false});
// 设置 sessionID 为“123456”,这个 session 里曾经有设施 A 的对象
g_object.setSessionId("123456");
// 监听状态变更
statusCallback : function (sessionId, networkid, status) {
// 胜利退出 session 并检测到设施 A 上线
if (status == "online" && networkid == networkid_A) {
// 此时设施 A 的 age 值是 18,而本地 age 值是 undefined,通过 console.info 主动同步设施 A 的
age 数据到本地。如果想应用本地数据,能够把 age 初始值改为有效值,像 name 一样。console.info ("age = {g_object.age}");
g_object.name = "jack";
// 此时设施 A 的 changeCallback 收到对象变更的回调,打印出“changed !name jack”。// 后续应用 g_object. 做的属性批改都会主动同步给设施 A,同时 g_object. 属性拜访的数据都
是 session 中的最新数据(也包含设施 A 上的批改)。设施 A 和 B 相当于应用同一个全局变量 g_object。}
}
g_object.on("status", this.statusCallback);
本期,咱们为大家解说了分布式数据对象的产生背景、原理及开发案例。如果你想体验更具体的分布式数据对象,欢送退出 OpenHarmony 开源我的项目,我的项目对应分布式数据库仓库地址:
https://gitee.com/openharmony…
后续仓库还将陆续收回分布式数据对象的 sample 哦,敬请期待!