日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
OpenHarmony源碼解析之分布式數(shù)據(jù)庫(kù)

OpenHarmony 源碼解析之分布式數(shù)據(jù)庫(kù)

作者:卞紹雷 2021-12-14 10:16:00

系統(tǒng)

分布式 本文基于OpenHarmonyOS 3.0 LTS 來講解分布式數(shù)據(jù)服務(wù)(Distributed Data Service,DDS) 提供不同設(shè)備間數(shù)據(jù)庫(kù)數(shù)據(jù)分布式的能力。

成都創(chuàng)新互聯(lián)2013年開創(chuàng)至今,先為阿榮等服務(wù)建站,阿榮等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為阿榮企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.cdcxhl.com

1 簡(jiǎn)介

本文基于OpenHarmonyOS 3.0 LTS 來講解分布式數(shù)據(jù)服務(wù)(Distributed Data Service,DDS) 提供不同設(shè)備間數(shù)據(jù)庫(kù)數(shù)據(jù)分布式的能力。從架構(gòu)上來說,分布式數(shù)據(jù)服務(wù)是開源鴻蒙底層服務(wù)的基礎(chǔ)服務(wù),與分布式任務(wù)調(diào)度同層。然而在使用分布式任務(wù)調(diào)度功能時(shí),基本上都需要進(jìn)一步要求數(shù)據(jù)交互功能,完成完整的分布式功能,因此在學(xué)習(xí)分布式任務(wù)調(diào)度的同時(shí),不可避免的需要學(xué)習(xí)分布式數(shù)據(jù)服務(wù)相關(guān)的功能與底層服務(wù)。

本文在寫作時(shí),調(diào)試JS的DEMO時(shí)發(fā)現(xiàn)了更底層的方舟JS運(yùn)行層的BUG,提交了ISSUE,并試圖提交了PR。如果大家在運(yùn)行DEMO時(shí)發(fā)現(xiàn)問題,請(qǐng)先嘗試合并上述PR并重新全部編譯系統(tǒng)并刷機(jī)再試。

1.1 分布式相關(guān)

  • 《OpenHarmony 源碼解析之分布式任務(wù)調(diào)度》
  • 《OpenHarmony 源碼解析之分布式數(shù)據(jù)庫(kù)》

1.2 OpenHarmony架構(gòu)圖

2 基礎(chǔ)知識(shí)

2.1 概述

先看開源鴻蒙官方文檔對(duì)分布式數(shù)據(jù)服務(wù)的描述:

分布式數(shù)據(jù)服務(wù)(Distributed Data Service,DDS) 提供不同設(shè)備間數(shù)據(jù)庫(kù)數(shù)據(jù)分布式的能力。通過結(jié)合帳號(hào)、應(yīng)用和數(shù)據(jù)庫(kù)三元組,分布式數(shù)據(jù)服務(wù)對(duì)數(shù)據(jù)進(jìn)行隔離。在通過可信認(rèn)證的設(shè)備間,分布式數(shù)據(jù)服務(wù)支持?jǐn)?shù)據(jù)相互同步,為用戶提供在多種終端設(shè)備上一致的數(shù)據(jù)訪問體驗(yàn)。

目前開源鴻蒙還沒有整合賬號(hào)功能,因此測(cè)試的時(shí)候賬號(hào)可以自由選擇,填寫一致即可。應(yīng)用和數(shù)據(jù)庫(kù)則必須保持一致,才能進(jìn)行完整的分布式數(shù)據(jù)數(shù)據(jù)隔離,提供數(shù)據(jù)在多種終端設(shè)備上一致的訪問體驗(yàn)。

2.2 源碼結(jié)構(gòu)

  
 
 
 
  1. ├── BUILD.gn 
  2. ├── figures 
  3. │   ├── en-us_image_0000001162536643.png 
  4. │   └── zh-cn_image_0000001162536643.png 
  5. ├── frameworks 
  6. │   ├── innerkitsimpl 
  7. │   │   └── distributeddatafwk # 框架層實(shí)現(xiàn) 
  8. │   │       ├── include 
  9. │   │       ├── src 
  10. │   │       └── test 
  11. │   └── jskitsimpl 
  12. │       └── distributeddata    # JS接口實(shí)現(xiàn) 
  13. │           ├── include 
  14. │           └── src 
  15. ├── interfaces 
  16. │   ├── innerkits                # 內(nèi)部接口,主要是頭文件 
  17. │   │   ├── app_distributeddata  
  18. │   │   │   ├── BUILD.gn 
  19. │   │   │   └── include 
  20. │   │   └── distributeddata 
  21. │   │       ├── BUILD.gn 
  22. │   │       └── include 
  23. │   └── jskits                   # JS接口,BUILD用 
  24. │       └── distributeddata 
  25. │           └── BUILD.gn 
  26. ├── LICENSE 
  27. ├── OAT.xml 
  28. ├── ohos.build 
  29. ├── README.md 
  30. ├── README_zh.md 
  31. ├── services 
  32. │   └── distributeddataservice 
  33. │       ├── adapter              # 適配實(shí)現(xiàn) 
  34. │       │   ├── account          # 賬號(hào)適配 
  35. │       │   ├── autils           # 實(shí)用庫(kù),包括任務(wù)、線程、目錄等 
  36. │       │   ├── broadcaster      # 發(fā)送廣播 
  37. │       │   ├── BUILD.gn 
  38. │       │   ├── communicator     # 通訊適配 
  39. │       │   ├── dfx              # 日志、統(tǒng)計(jì)、錯(cuò)誤等相關(guān)處理 
  40. │       │   ├── include 
  41. │       │   ├── LICENSE 
  42. │       │   ├── permission        # 權(quán)限 
  43. │       │   ├── security          # 安全相關(guān) 
  44. │       │   ├── test 
  45. │       │   └── utils 
  46. │       ├── app                   # 用戶程序?qū)崿F(xiàn) 
  47. │       ├── libs 
  48. │       │   └── distributeddb 
  49. │       │       ├── BUILD.gn 
  50. │       │       ├── common 
  51. │       │       ├── communicator  # 設(shè)備間通訊 
  52. │       │       ├── include 
  53. │       │       ├── interfaces 
  54. │       │       ├── storage   # 存儲(chǔ)實(shí)現(xiàn),包括單版本KV、多版本KV、SQLITE3等 
  55. │       │       ├── syncer    # 同步 
  56. │       │       └── test 
  57. │       ├── sa_profile 
  58. │       └── test 
  59. └── test 

2.3 分布式數(shù)據(jù)服務(wù)架構(gòu)設(shè)計(jì)圖

2.4 數(shù)據(jù)同步

官方文檔是這么描述的:

通過調(diào)用分布式數(shù)據(jù)服務(wù)接口實(shí)現(xiàn)分布式數(shù)據(jù)庫(kù)創(chuàng)建、訪問、訂閱功能,服務(wù)接口通過操作服務(wù)組件提供的能力,將數(shù)據(jù)存儲(chǔ)至存儲(chǔ)組件,存儲(chǔ)組件調(diào)用同步組件實(shí)現(xiàn)將數(shù)據(jù)同步,同步組件使用通信適配層將數(shù)據(jù)同步至遠(yuǎn)端設(shè)備,遠(yuǎn)端設(shè)備通過同步組件接收數(shù)據(jù),并更新至本端存儲(chǔ)組件。

2.5 分布式數(shù)據(jù)

最終一致性:是指某一設(shè)備成功增、刪、改數(shù)據(jù)后,組網(wǎng)內(nèi)設(shè)備可能讀取不到本次更新數(shù)據(jù),但在某個(gè)時(shí)間窗口之后組網(wǎng)內(nèi)設(shè)備的數(shù)據(jù)能夠達(dá)到一致狀態(tài)。

強(qiáng)一致性對(duì)分布式數(shù)據(jù)的管理要求非常高,在服務(wù)器的分布式場(chǎng)景可能會(huì)遇到。因?yàn)橐苿?dòng)終端設(shè)備的不常在線、以及無中心的特性,分布式數(shù)據(jù)服務(wù)不支持強(qiáng)一致,只支持最終一致性。

目前分布式數(shù)據(jù)的數(shù)據(jù)模型僅支持KV數(shù)據(jù)模型,不支持外鍵、觸發(fā)器等關(guān)系型數(shù)據(jù)庫(kù)中的技術(shù)點(diǎn)。雖然開源鴻蒙底層支持基于SQLITE3的關(guān)系型數(shù)據(jù)庫(kù),但是并不在分布式數(shù)據(jù)層面支持。

當(dāng)前KV數(shù)據(jù)模型的限制:

  • 設(shè)備協(xié)同數(shù)據(jù)庫(kù),Key最大支持896Byte,Value最大支持4MB。
  • 單版本數(shù)據(jù)庫(kù),Key最大支持1KB,Value最大支持4MB。
  • 每個(gè)程序最多支持同時(shí)打開16個(gè)DB。
  • 當(dāng)前流控機(jī)制針對(duì)KvStore的接口1秒最大訪問1000次,1分鐘最大訪問10000次。
  • KvManager的接口1秒最大訪問50次,1分鐘最大訪問500次。

2.6 使用前提

從開源鴻蒙的分布式數(shù)據(jù)源代碼中,可以看到目前只有手機(jī)(phone)、穿戴式設(shè)備(wearable)、車載系統(tǒng)(ivi)會(huì)搭載,其它更輕量的設(shè)備可能暫時(shí)不支持,或者需要剪裁定制支持。

目前在兩臺(tái)標(biāo)準(zhǔn)設(shè)備的開源系統(tǒng)鴻蒙上,是默認(rèn)集成了該功能,可以直接使用的。

開源鴻蒙的分布式數(shù)據(jù)如果只在單機(jī)使用,那么無需前提條件。如果需要其分布式功能,那么就需要設(shè)備之間完成組網(wǎng);而組網(wǎng)的前提條件是完成設(shè)備認(rèn)證。具體步驟,請(qǐng)參考OpenHarmony 源碼解析之分布式任務(wù)調(diào)度。

3 編程接口

3.1 導(dǎo)入模塊

  
 
 
 
  1. import distributedData from '@ohos.data.distributedData'; 

 下面各個(gè)接口大多有callback和promise兩種異步方式,本文均以promise方式為例,callback方式大同小異,請(qǐng)自行查閱文檔。

3.2 創(chuàng)建管理器

  
 
 
 
  1. distributedData.createKVManager 
  2. createKVManager(config: KVManagerConfig, callback: AsyncCallback): void 
  3. createKVManager(config: KVManagerConfig): Promise 

 創(chuàng)建一個(gè)KVManager對(duì)象實(shí)例,用于管理數(shù)據(jù)庫(kù)對(duì)象,并通過Promise方式返回,此方法為異步方法。

示例:

  
 
 
 
  1. let kvManager; 
  2. try { 
  3.     const kvManagerConfig = { 
  4.         bundleName : 'com.example.datamanagertest', 
  5.         userInfo : { 
  6.             userId : '0', 
  7.             userType : 0 
  8.         } 
  9.     } 
  10.     distributedData.createKVManager(kvManagerConfig).then((manager) => { 
  11.         console.log("createKVManager success"); 
  12.         kvManager = manager; 
  13.     }).catch((err) => { 
  14.         console.log("createKVManager err: "  + JSON.stringify(err)); 
  15.     }); 
  16. } catch (e) { 
  17.     console.log("An unexpected error occurred. Error:" + e); 

3.3 獲取存儲(chǔ)實(shí)例

  
 
 
 
  1. kvManager.getKVStore 
  2. getKVStore(storeId: string, options: Options): Promise 

通過指定Options和storeId,創(chuàng)建并獲取KVStore數(shù)據(jù)庫(kù),并通過Promise方式返回,此方法為異步方法。

示例:

  
 
 
 
  1. let kvStore; 
  2. try { 
  3.     const options = { 
  4.         createIfMissing : true, 
  5.         encrypt : false, 
  6.         backup : false, 
  7.         autoSync : true, //手動(dòng)同步、自動(dòng)同步 
  8.         kvStoreType : 1, //當(dāng)前只能使用0(默認(rèn)):表示多設(shè)備協(xié)同數(shù)據(jù)庫(kù),1:?jiǎn)伟姹緮?shù)據(jù)庫(kù) 
  9.         securityLevel : 3, 
  10.     }; 
  11.     kvManager.getKVStore('storeId', options).then((store) => { 
  12.         console.log("getKVStore success"); 
  13.         kvStore = store; 
  14.     }).catch((err) => { 
  15.         console.log("getKVStore err: "  + JSON.stringify(err)); 
  16.     }); 
  17. } catch (e) { 
  18.     console.log("An unexpected error occurred. Error:" + e); 

3.4 存、取、刪除、同步

  
 
 
 
  1. kvStore.put(key: string, value: Uint8Array | string | number | boolean): Promise 
  2. kvStore.get(key: string): Promise 
  3. kvStore.delete(key: string): Promise 
  4. kvStore.sync(deviceIdList: string[], mode: SyncMode, allowedDelayMs?: number): void 

3.5 注冊(cè)事件通知回調(diào)

SubscribeType 描述訂閱類型。

  • 0: SUBSCRIBE_TYPE_LOCAL 表示訂閱本地?cái)?shù)據(jù)變更。
  • 1: SUBSCRIBE_TYPE_REMOTE 表示訂閱遠(yuǎn)端數(shù)據(jù)變更。
  • 2: SUBSCRIBE_TYPE_ALL 表示訂閱遠(yuǎn)端和本地?cái)?shù)據(jù)變更。
  
 
 
 
  1. kvStore.on(event: 'dataChange', type: SubscribeType, observer: Callback): void 
  2. kvStore.on(event: 'syncComplete', syncCallback: Callback>): void 

4 小結(jié)

以上步驟,均已在DevEco Studio 3.0.0.600 x64中編寫成功,并且在兩臺(tái)Hi3516D設(shè)備間成功運(yùn)行,附代碼(分布式任務(wù)調(diào)度和分布式數(shù)據(jù)測(cè)試.zip)。

再次提醒,分布式數(shù)據(jù)底層依賴ARK JS引擎,目前發(fā)現(xiàn)字符串處理有BUG,如運(yùn)行出現(xiàn)問題,請(qǐng)先合并PR,然后重新編譯全系統(tǒng)并刷機(jī)后再運(yùn)行DEMO。

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.cdcxhl.com


網(wǎng)站欄目:OpenHarmony源碼解析之分布式數(shù)據(jù)庫(kù)
當(dāng)前鏈接:http://m.5511xx.com/article/dpgpdcc.html