3月底發(fā)布的OpenAtom OpenHarmony(以下簡(jiǎn)稱“OpenHarmony”)3.1 Release版本中,新增了分布式數(shù)據(jù)對(duì)象特性。什么是分布式數(shù)據(jù)對(duì)象呢?本期就讓我們一起來(lái)了解一下~
一、背景介紹
OpenHarmony 作為分布式操作系統(tǒng),支持運(yùn)行在不同的終端設(shè)備上。這些終端設(shè)備通過(guò)跨端遷移和多端協(xié)同等,可以為用戶提供豐富、流暢的全場(chǎng)景體驗(yàn)。在這種分布式場(chǎng)景下,不同設(shè)備之間需要進(jìn)行數(shù)據(jù)互通來(lái)實(shí)現(xiàn)設(shè)備間的配合。
下面先看以下這個(gè)分布式場(chǎng)景的示例:
示例:可觸屏和TV的協(xié)作
在 TV/PAD 上觀看視頻時(shí),在可觸屏設(shè)備上控制 TV/PAD 上的播放狀態(tài)、進(jìn)度、音量和速度等,實(shí)現(xiàn)多端控制。
圖1 多端控制,解放設(shè)備限制
要實(shí)現(xiàn)上面這個(gè)示例的功能,首先必須實(shí)現(xiàn)設(shè)備之間的數(shù)據(jù)同步。傳統(tǒng)方式下,設(shè)備之間的數(shù)據(jù)同步,需要開(kāi)發(fā)者完成消息處理邏輯,包括:建立通信鏈接、消息收發(fā)處理、錯(cuò)誤重試、數(shù)據(jù)沖突解決等操作,工作量非常大。而且設(shè)備越多,調(diào)試復(fù)雜度將呈指數(shù)增長(zhǎng)。是否有更簡(jiǎn)單的實(shí)現(xiàn)方式?經(jīng)過(guò)分析,我們發(fā)現(xiàn),示例中的播放狀態(tài)、進(jìn)度、音量和速度等其實(shí)都是變量。如果這些變量支持“全局”訪問(wèn),那么開(kāi)發(fā)者跨設(shè)備訪問(wèn)這些變量就能像操作本地變量一樣,數(shù)據(jù)就能夠自動(dòng)高效、便捷地實(shí)現(xiàn)多端同步了。
為此,本次 OpenHarmony v3.1 Release 版本新增了分布式數(shù)據(jù)對(duì)象特性。分布式數(shù)據(jù)對(duì)象為開(kāi)發(fā)者在分布式應(yīng)用場(chǎng)景下提供簡(jiǎn)單易用的 JS 接口,輕松實(shí)現(xiàn)多設(shè)備間同應(yīng)用的數(shù)據(jù)協(xié)同,同時(shí)設(shè)備間可以監(jiān)聽(tīng)對(duì)象的狀態(tài)和數(shù)據(jù)變更。與傳統(tǒng)方式相比,分布式數(shù)據(jù)對(duì)象大大減少了開(kāi)發(fā)者的工作量。
(為方便描述,后文中“分布式數(shù)據(jù)對(duì)象”也簡(jiǎn)稱為“對(duì)象”。)
二、原理解析
這么簡(jiǎn)單高效的分布式數(shù)據(jù)對(duì)象技術(shù)具體如何實(shí)現(xiàn)的呢?讓我們來(lái)一一解析~
1.對(duì)象的數(shù)據(jù)同步
分布式數(shù)據(jù)對(duì)象,最重要的功能就是對(duì)象之間的數(shù)據(jù)同步??尚沤M網(wǎng)內(nèi)的設(shè)備可以在本地創(chuàng)建分布式數(shù)據(jù)對(duì)象,并設(shè)置 sessionID。不同設(shè)備上的分布式數(shù)據(jù)對(duì)象,通過(guò)設(shè)置相同的 sessionID,建立對(duì)象之間的同步關(guān)系。
如圖 3 所示,設(shè)備 A 和設(shè)備 B 上的“分布式數(shù)據(jù)對(duì)象1”,其 sessionID 均為 session1,這兩個(gè)對(duì)象建立了 session1 的同步關(guān)系。
圖2對(duì)象的同步關(guān)系
一個(gè)同步關(guān)系中,一個(gè)設(shè)備只能有一個(gè)對(duì)象加入。比如圖 3 中,設(shè)備 A 的“分布式數(shù)據(jù)對(duì)象 1”已經(jīng)加入了 session1 的同步關(guān)系,所以,設(shè)備 A 的“分布式數(shù)據(jù)對(duì)象 2”就加入失敗了。
建立同步關(guān)系后,每個(gè) session 有一份共享對(duì)象數(shù)據(jù)。加入了同一個(gè) session 的對(duì)象,支持以下操作:
(1)讀取/修改 session 中的數(shù)據(jù)。
(2)監(jiān)聽(tīng)數(shù)據(jù)變更,感知其他對(duì)象對(duì)共享對(duì)象數(shù)據(jù)的修改。
(3)監(jiān)聽(tīng)狀態(tài)變更,感知其他對(duì)象的加入和離開(kāi)。
關(guān)于分布式數(shù)據(jù)對(duì)象的數(shù)據(jù)同步,值得注意的是,同步的最小單位是“屬性”。比如,圖 4 中對(duì)象 1 包含三個(gè)屬性:name、age 和 parents。當(dāng)其中一個(gè)屬性變更時(shí),則數(shù)據(jù)同步時(shí)只需同步此變更的屬性。
圖3數(shù)據(jù)視圖
2.對(duì)象的生命周期
接下來(lái),我們從生命周期的角度來(lái)全面認(rèn)識(shí)一下分布式數(shù)據(jù)對(duì)象。
圖4生命周期
如圖 5 所示,對(duì)象包括三種狀態(tài):未初始化、本地對(duì)象和分布式對(duì)象。這三種狀態(tài)說(shuō)明如下:
圖5對(duì)象的三種狀態(tài)
根據(jù)條件變化,對(duì)象在這三種狀態(tài)之間會(huì)來(lái)回切換:
最開(kāi)始,對(duì)象處于未初始化狀態(tài)。實(shí)例化之后,對(duì)象就從未初始化狀態(tài)切換到本地對(duì)象狀態(tài)。給對(duì)象設(shè)置 sessionID,收到對(duì)端設(shè)備對(duì)象上線通知后,此時(shí)可以跨設(shè)備同步數(shù)據(jù)了,對(duì)象就進(jìn)入了分布式對(duì)象狀態(tài)。
本端或遠(yuǎn)端設(shè)備下線,或者 sessionID 被清除,那么對(duì)象又切回本地對(duì)象狀態(tài)。分布式對(duì)象實(shí)例和對(duì)應(yīng)的內(nèi)存數(shù)據(jù)庫(kù)都保存在應(yīng)用程序的進(jìn)程空間,當(dāng)應(yīng)用程序退出后,分布式對(duì)象和內(nèi)存數(shù)據(jù)庫(kù)也隨之銷毀,對(duì)象直接進(jìn)入未初始化狀態(tài)。
三、開(kāi)發(fā)約束及案例
經(jīng)過(guò)上面的介紹,大家對(duì)分布式數(shù)據(jù)對(duì)象已經(jīng)有了充分的了解了,下面就要介紹開(kāi)發(fā)者們最關(guān)心的“怎么用”的問(wèn)題了。
在使用分布式數(shù)據(jù)對(duì)象之前,我們先說(shuō)明一下相關(guān)的開(kāi)發(fā)約束:
1. 單個(gè)應(yīng)用程序最多只能創(chuàng)建 16 個(gè)分布式數(shù)據(jù)對(duì)象實(shí)例。
2. 考慮到性能和用戶體驗(yàn),最多不超過(guò) 3 個(gè)設(shè)備進(jìn)行數(shù)據(jù)協(xié)同。
3. 考慮到性能和用戶體驗(yàn),分布式數(shù)據(jù)對(duì)象大小限制在 500KB 以內(nèi)。
4. 分布式數(shù)據(jù)對(duì)象的數(shù)據(jù)同步發(fā)生在同一個(gè)應(yīng)用程序下,且同 session ID 之間。
接下來(lái),我們通過(guò)一個(gè)簡(jiǎn)單的開(kāi)發(fā)案例來(lái)講解如何使用分布式數(shù)據(jù)對(duì)象。此案例中,設(shè)備 A 和設(shè)備 B 分別創(chuàng)建一個(gè)包含 3 個(gè)屬性的對(duì)象,這兩個(gè)對(duì)象加入到同一個(gè) session,建立同步關(guān)系。一個(gè)對(duì)象的屬性變更會(huì)自動(dòng)同步到另一個(gè)對(duì)象,從而實(shí)現(xiàn)“全局變量”效果。
通過(guò)此案例,我們能夠掌握分布式數(shù)據(jù)對(duì)象的基本操作,包括:
1. 創(chuàng)建對(duì)象
2. 設(shè)置 sessionID
3. 設(shè)置監(jiān)聽(tīng)對(duì)象變更的回調(diào)
4. 監(jiān)聽(tīng)狀態(tài)變更
代碼示例如下:
1. 設(shè)備 A 的 JS 代碼示例:
import distributedObject from '@ohos.data.distributedDataObject'
//創(chuàng)建對(duì)象,對(duì)象包含三個(gè)屬性:name、age和isVis
var g_object = distributedObject.createDistributedObject({name:"Amy", age:18, isVis:false});
//設(shè)置sessionID為“123456”
g_object.setSessionId("123456");
//設(shè)置監(jiān)聽(tīng)對(duì)象變更的回調(diào)
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. 設(shè)備 B 的 JS 代碼示例:
//創(chuàng)建對(duì)象,對(duì)象包含三個(gè)屬性:name、age和isVis
var g_object = distributedObject.createDistributedObject({name:"Amy", age:undefined, isVis:false});
//設(shè)置sessionID為“123456”,這個(gè)session里已經(jīng)有設(shè)備A的對(duì)象
g_object.setSessionId("123456");
//監(jiān)聽(tīng)狀態(tài)變更
statusCallback : function (sessionId, networkid, status) {
//成功加入session并檢測(cè)到設(shè)備A上線
if (status == "online" && networkid == networkid_A) {
//此時(shí)設(shè)備A的age值是18,而本地age值是undefined,通過(guò)console.info自動(dòng)同步設(shè)備A的age數(shù)據(jù)到本地。如果想使用本地?cái)?shù)據(jù),可以把a(bǔ)ge初始值改為有效值,像name一樣。
console.info ("age = {g_object.age}");
g_object.name = "jack";
//此時(shí)設(shè)備A的changeCallback收到對(duì)象變更的回調(diào),打印出“changed !name jack”。
//后續(xù)使用g_object.做的屬性修改都會(huì)自動(dòng)同步給設(shè)備A,同時(shí)g_object.屬性訪問(wèn)的數(shù)據(jù)都是session中的最新數(shù)據(jù)(也包括設(shè)備A上的修改)。設(shè)備A和B相當(dāng)于使用同一個(gè)全局變量g_object。
}
}
g_object.on("status",this.statusCallback);
本期,我們?yōu)榇蠹抑v解了分布式數(shù)據(jù)對(duì)象的產(chǎn)生背景、原理及開(kāi)發(fā)案例。如果你想體驗(yàn)更詳細(xì)的分布式數(shù)據(jù)對(duì)象,歡迎加入 OpenHarmony 開(kāi)源項(xiàng)目,項(xiàng)目對(duì)應(yīng)分布式數(shù)據(jù)庫(kù)倉(cāng)庫(kù)地址:
https://gitee.com/openharmony/distributeddatamgr_objectstore
后續(xù)倉(cāng)庫(kù)還將陸續(xù)發(fā)出分布式數(shù)據(jù)對(duì)象的 sample 哦,敬請(qǐng)期待!
審核編輯 :李倩
-
分布式數(shù)據(jù)
+關(guān)注
關(guān)注
0文章
9瀏覽量
8942 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3732瀏覽量
16446
原文標(biāo)題:分布式數(shù)據(jù)對(duì)象:超級(jí)終端的"全局變量"
文章出處:【微信號(hào):gh_e4f28cfa3159,微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論