3月底发布的OpenAtom OpenHarmony(以下简称“OpenHarmony”)3.1 Release版本中,新增了分布式数据对象特性。什么是分布式数据对象呢?本期就让我们一起来了解一下~

一、背景介绍

OpenHarmony 作为分布式操作系统,支持运行在不同的终端设备上。这些终端设备通过跨端迁移和多端协同等,可以为用户提供丰富、流畅的全场景体验。在这种分布式场景下,不同设备之间需要进行数据互通来实现设备间的配合。
 
下面先看以下这个分布式场景的示例:
 
示例:可触屏和TV的协作
在 TV/PAD 上观看视频时,在可触屏设备上控制 TV/PAD 上的播放状态、进度、音量和速度等,实现多端控制。
图1 多端控制,解放设备限制
 
要实现上面这个示例的功能,首先必须实现设备之间的数据同步。传统方式下,设备之间的数据同步,需要开发者完成消息处理逻辑,包括:建立通信链接、消息收发处理、错误重试、数据冲突解决等操作,工作量非常大。而且设备越多,调试复杂度将呈指数增长。是否有更简单的实现方式?经过分析,我们发现,示例中的播放状态、进度、音量和速度等其实都是变量。如果这些变量支持“全局”访问,那么开发者跨设备访问这些变量就能像操作本地变量一样,数据就能够自动高效、便捷地实现多端同步了。
 
为此,本次 OpenHarmony v3.1 Release 版本新增了分布式数据对象特性。分布式数据对象为开发者在分布式应用场景下提供简单易用的 JS 接口,轻松实现多设备间同应用的数据协同,同时设备间可以监听对象的状态和数据变更。与传统方式相比,分布式数据对象大大减少了开发者的工作量。
(为方便描述,后文中“分布式数据对象”也简称为“对象”。)
 

二、原理解析

这么简单高效的分布式数据对象技术具体如何实现的呢?让我们来一一解析~
 
1.对象的数据同步
分布式数据对象,最重要的功能就是对象之间的数据同步。可信组网内的设备可以在本地创建分布式数据对象,并设置 sessionID。不同设备上的分布式数据对象,通过设置相同的 sessionID,建立对象之间的同步关系。
 
如图 3 所示,设备 A 和设备 B 上的“分布式数据对象1”,其 sessionID 均为 session1,这两个对象建立了 session1 的同步关系。
 
图2 对象的同步关系
 
一个同步关系中,一个设备只能有一个对象加入。比如图 3 中,设备 A 的“分布式数据对象 1”已经加入了 session1 的同步关系,所以,设备 A 的“分布式数据对象 2”就加入失败了。
 
建立同步关系后,每个 session 有一份共享对象数据。加入了同一个 session 的对象,支持以下操作:
(1)读取/修改 session 中的数据。
(2)监听数据变更,感知其他对象对共享对象数据的修改。
(3)监听状态变更,感知其他对象的加入和离开。
 
关于分布式数据对象的数据同步,值得注意的是,同步的最小单位是“属性”。比如,图 4 中对象 1 包含三个属性:name、age 和 parents。当其中一个属性变更时,则数据同步时只需同步此变更的属性。
 
图3 数据视图
 
2.对象的生命周期
接下来,我们从生命周期的角度来全面认识一下分布式数据对象。
 
图4 生命周期
 
如图 5 所示,对象包括三种状态:未初始化、本地对象和分布式对象。这三种状态说明如下:
 
图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和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);
2. 设备 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 开源项目,项目对应分布式数据库仓库地址:
 
后续仓库还将陆续发出分布式数据对象的 sample 哦,敬请期待!
 

分布式数据对象:超级终端的"全局变量"的更多相关文章

  1. Android系统在超级终端下必会的命令大全(adb shell命令大全)

    . 显示系统中全部Android平台: android list targets . 显示系统中全部AVD(模拟器): android list avd . 创建AVD(模拟器): android c ...

  2. Windows PowerShell漫谈-win7下没有超级终端

    Windows PowerShell是我在研究win7新特性的时候发现的新工具,起初没有对它产生太大的兴趣,只是简单看看了有关它的介绍.简单使用了一下,感觉上它和cmd.exe没有本质区别.对它产生兴 ...

  3. [转]ubuntu 下minicom超级终端的使用方法

    [转]ubuntu 下minicom超级终端的使用方法 http://blog.chinaunix.net/uid-25909619-id-3184639.html 系统环境: Ubuntu 11.0 ...

  4. Win7超级终端查看单片机printf输出

    问题描述:     编写单片机C程序时,经常会用到printf输出信息进行查看,如何查看printf输出? 问题解决:     (1)编写单片机C程序     ucos是一个实时多任务操作系统,以上是 ...

  5. 超级终端和SecureCRT进行Console口的连接

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  6. 怎样在超级终端和PC之间通过串口传输文件

    Windows环境下,通过SecureCRT软件,用串口向ARM开发板发送文件: 输入命令 rz,可以看到如下图所示: 选择路径点击上传即可. 如果是想从Arm开发板中把文件Down下来,则可以按照下 ...

  7. STM32F4 串口实验中收不到超级终端发送的数据,调试工具却可以

    我用串口精灵发送数据没有问题,但是接收数据没反应. 串口接受的时候必须要用中断的,你发送只靠单一的标志位是可以判断的,但是接受的时候,你是一直停留在while里面,我们判断接受是否完成,通过检测是否收 ...

  8. Win7下使用Putty代替超级终端通过COM串口连接开发板方法

    1.如果电脑(笔记本)没有串口接口,则需要使用一个 USB-Serial 转换线,这里使用 prolific usb-serial USB--串口转换线,首先需要在win7上安装对应的 USB--串口 ...

  9. linux超级终端minicom的使用方法

    ===== 一.Minicom介绍 =====       Linux下的Minicom的功能与Windows下的超级终端功能相似,可以通过串口控制外部的硬件   设备.适于在linux通过超级终端对 ...

  10. SecureCRT超级终端使用说明

    SecureCRT超级终端使用说明 一.连接POS机 1.运行SecureCRT,选择‘文件’菜单,在下拉菜单中选择‘快速连接’菜单: 2.在弹出的对话框中按如下图选择参数: 3.POS端开机,且数据 ...

随机推荐

  1. 类型别名TypeAlias

    from collections.abc import Iterable from typing import TypeAlias FromTo = tuple[str, str] # 3.10之前 ...

  2. Golang 常用工具记录

    Golang 常用工具记录 1 golang 类 1.1 日常使用的 copier 复制结构体到另外一个结构体 等等类似的功能 asynq Go中简单.可靠.高效的分布式任务队列,使用 redis 做 ...

  3. 第120篇: DOM编程(常用操作、动态脚本、样式及动态表格)

    好家伙,我回来了, 本篇为<JS高级程序设计>第十四章"DOM编程"学习笔记   1.DOM编程 我们知道DOM是HTML文档的编程接口, 我们可以通过HTML代码实现 ...

  4. 【教程】navicat配合HTTP通道远程连接SQLite数据库

    前言 缘由 好奇的我想查看服务器上宝塔面板的SQLite数据库 久别一月,特来水文.起因是我看到服务器上搭建的宝塔面板,好奇其中使用的SQLite数据库,想用navicat远程连接看一下,奈何不会玩, ...

  5. minio通过docker方式部署

    MinIO 是在 GNU Affero 通用公共许可证 v3.0 下发布的高性能对象存储. 它是与 Amazon S3 云存储服务兼容的 API 官方文档http://docs.minio.org.c ...

  6. Linux操作系统加固建议

    1.1.1 口令锁定策略 1.执行备份 (1).redhat执行备份: #cp -p /etc/pam.d/system-auth /etc/pam.d/system-auth_bak (2).SUS ...

  7. TCP 中的 Delay ACK 和 Nagle 算法

    哈喽大家好,我是咸鱼. 今天分享一篇大佬的文章,作者:卡瓦邦噶! 文章链接:https://www.kawabangga.com/posts/5845 教科书介绍的 TCP 内容通常比较基础:包括三次 ...

  8. slice 切片数组测试记录【GO 基础】

    〇.测试前准备 本文是在 GO 环境下测试记录系列之一,GO 基本环境部署步骤将略过,直接上代码. 下面是常用命令:[初始化 + 运行 + 编译] // {GOPATH} 环境变量值, example ...

  9. better-scroll 1.13

    简单入门示例:快速使用: <template> <div class="wrapper"> <div class="content" ...

  10. 一个简单的spdlog使用示例

    目录 引用源码 封装Log头文件 使用方法 spdlog是一个开源.跨平台.无依赖.只有头文件的C++11日志库,网上介绍的文章有很多这里就不过多的介绍了,GitHub链接:https://githu ...