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 被革除,那么对象又切回本地对象状态。分布式对象实例和对应的内存数据库都保留在应用程序的过程空间,当应用程序退出后,分布式对象和内存数据库也随之销毁,对象间接进入未初始化状态。

三、开发束缚及案例

通过下面的介绍,大家对分布式数据对象曾经有了充沛的理解了,上面就要介绍开发者们最关怀的“怎么用”的问题了。
在应用分布式数据对象之前,咱们先阐明一下相干的开发束缚:

  1. 单个应用程序最多只能创立 16 个分布式数据对象实例。
  2. 思考到性能和用户体验,最多不超过 3 个设施进行数据协同。
  3. 思考到性能和用户体验,分布式数据对象大小限度在 500KB 以内。
  4. 分布式数据对象的数据同步产生在同一个应用程序下,且同 session ID 之间。
    接下来,咱们通过一个简略的开发案例来解说如何应用分布式数据对象。此案例中,设施 A 和设施 B 别离创立一个蕴含 3 个属性的对象,这两个对象退出到同一个 session,建设同步关系。一个对象的属性变更会主动同步到另一个对象,从而实现“全局变量”成果。
    通过此案例,咱们可能把握分布式数据对象的基本操作,包含:
    (1). 创建对象
    (2). 设置 sessionID
    (3). 设置监听对象变更的回调
    (4). 监听状态变更

代码示例如下:

  1. 设施 A 的 JS 代码示例:
import distributedObject from '@ohos.data.distributedDataObject'//创建对象,对象蕴含三个属性:name、age和isVisvar 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);
  1. 设施 B 的 JS 代码示例:
//创建对象,对象蕴含三个属性:name、age和isVisvar 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 哦,敬请期待!