OpenHarmony 源码解析之分布式数据库

OpenHarmony 源码解析之分布式数据库

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

系统

分布式 本文基于OpenHarmonyOS 3.0 LTS 来讲解分布式数据服务(Distributed Data Service,DDS) 提供不同设备间数据库数据分布式的能力。

[[440154]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.IDC.NET

1 简介

本文基于OpenHarmonyOS 3.0 LTS 来讲解分布式数据服务(Distributed Data Service,DDS) 提供不同设备间数据库数据分布式的能力。从架构上来说,分布式数据服务是开源鸿蒙底层服务的基础服务,与分布式任务调度同层。然而在使用分布式任务调度功能时,基本上都需要进一步要求数据交互功能,完成完整的分布式功能,因此在学习分布式任务调度的同时,不可避免的需要学习分布式数据服务相关的功能与底层服务。

本文在写作时,调试JS的DEMO时发现了更底层的方舟JS运行层的BUG,提交了ISSUE,并试图提交了PR。如果大家在运行DEMO时发现问题,请先尝试合并上述PR并重新全部编译系统并刷机再试。

1.1 分布式相关

  • 《OpenHarmony 源码解析之分布式任务调度》
  • 《OpenHarmony 源码解析之分布式数据库》

1.2 OpenHarmony架构图

2 基础知识

2.1 概述

先看开源鸿蒙官方文档对分布式数据服务的描述:

分布式数据服务(Distributed Data Service,DDS) 提供不同设备间数据库数据分布式的能力。通过结合帐号、应用和数据库三元组,分布式数据服务对数据进行隔离。在通过可信认证的设备间,分布式数据服务支持数据相互同步,为用户提供在多种终端设备上一致的数据访问体验。

目前开源鸿蒙还没有整合账号功能,因此测试的时候账号可以自由选择,填写一致即可。应用和数据库则必须保持一致,才能进行完整的分布式数据数据隔离,提供数据在多种终端设备上一致的访问体验。

2.2 源码结构

  1. ├── BUILD.gn 
  2. ├── figures 
  3. │   ├── en-us_image_0000001162536643.png 
  4. │   └── zh-cn_image_0000001162536643.png 
  5. ├── frameworks 
  6. │   ├── innerkitsimpl 
  7. │   │   └── distributeddatafwk # 框架层实现 
  8. │   │       ├── include 
  9. │   │       ├── src 
  10. │   │       └── test 
  11. │   └── jskitsimpl 
  12. │       └── distributeddata    # JS接口实现 
  13. │           ├── include 
  14. │           └── src 
  15. ├── interfaces 
  16. │   ├── innerkits                # 内部接口,主要是头文件 
  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              # 适配实现 
  34. │       │   ├── account          # 账号适配 
  35. │       │   ├── autils           # 实用库,包括任务、线程、目录等 
  36. │       │   ├── broadcaster      # 发送广播 
  37. │       │   ├── BUILD.gn 
  38. │       │   ├── communicator     # 通讯适配 
  39. │       │   ├── dfx              # 日志、统计、错误等相关处理 
  40. │       │   ├── include 
  41. │       │   ├── LICENSE 
  42. │       │   ├── permission        # 权限 
  43. │       │   ├── security          # 安全相关 
  44. │       │   ├── test 
  45. │       │   └── utils 
  46. │       ├── app                   # 用户程序实现 
  47. │       ├── libs 
  48. │       │   └── distributeddb 
  49. │       │       ├── BUILD.gn 
  50. │       │       ├── common 
  51. │       │       ├── communicator  # 设备间通讯 
  52. │       │       ├── include 
  53. │       │       ├── interfaces 
  54. │       │       ├── storage   # 存储实现,包括单版本KV、多版本KV、SQLITE3等 
  55. │       │       ├── syncer    # 同步 
  56. │       │       └── test 
  57. │       ├── sa_profile 
  58. │       └── test 
  59. └── test 

2.3 分布式数据服务架构设计图

2.4 数据同步

官方文档是这么描述的:

通过调用分布式数据服务接口实现分布式数据库创建、访问、订阅功能,服务接口通过操作服务组件提供的能力,将数据存储至存储组件,存储组件调用同步组件实现将数据同步,同步组件使用通信适配层将数据同步至远端设备,远端设备通过同步组件接收数据,并更新至本端存储组件。

2.5 分布式数据

最终一致性:是指某一设备成功增、删、改数据后,组网内设备可能读取不到本次更新数据,但在某个时间窗口之后组网内设备的数据能够达到一致状态。

强一致性对分布式数据的管理要求非常高,在服务器的分布式场景可能会遇到。因为移动终端设备的不常在线、以及无中心的特性,分布式数据服务不支持强一致,只支持最终一致性。

目前分布式数据的数据模型仅支持KV数据模型,不支持外键、触发器等关系型数据库中的技术点。虽然开源鸿蒙底层支持基于SQLITE3的关系型数据库,但是并不在分布式数据层面支持。

当前KV数据模型的限制:

  • 设备协同数据库,Key最大支持896Byte,Value最大支持4MB。
  • 单版本数据库,Key最大支持1KB,Value最大支持4MB。
  • 每个程序最多支持同时打开16个DB。
  • 当前流控机制针对KvStore的接口1秒最大访问1000次,1分钟最大访问10000次。
  • KvManager的接口1秒最大访问50次,1分钟最大访问500次。

2.6 使用前提

从开源鸿蒙的分布式数据源代码中,可以看到目前只有手机(phone)、穿戴式设备(wearable)、车载系统(ivi)会搭载,其它更轻量的设备可能暂时不支持,或者需要剪裁定制支持。

目前在两台标准设备的开源系统鸿蒙上,是默认集成了该功能,可以直接使用的。

开源鸿蒙的分布式数据如果只在单机使用,那么无需前提条件。如果需要其分布式功能,那么就需要设备之间完成组网;而组网的前提条件是完成设备认证。具体步骤,请参考OpenHarmony 源码解析之分布式任务调度。

3 编程接口

3.1 导入模块

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

 下面各个接口大多有callback和promise两种异步方式,本文均以promise方式为例,callback方式大同小异,请自行查阅文档。

3.2 创建管理器

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

 创建一个KVManager对象实例,用于管理数据库对象,并通过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 获取存储实例

  1. kvManager.getKVStore 
  2. getKVStore<T extends KVStore>(storeId: string, options: Options): Promise<T> 

通过指定Options和storeId,创建并获取KVStore数据库,并通过Promise方式返回,此方法为异步方法。

示例:

  1. let kvStore; 
  2. try { 
  3.     const options = { 
  4.         createIfMissing : true
  5.         encrypt : false
  6.         backup : false
  7.         autoSync : true, //手动同步、自动同步 
  8.         kvStoreType : 1, //当前只能使用0(默认):表示多设备协同数据库,1:单版本数据库 
  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<void> 
  2. kvStore.get(key: string): Promise<Uint8Array | string | boolean | number> 
  3. kvStore.delete(key: string): Promise<void> 
  4. kvStore.sync(deviceIdList: string[], mode: SyncMode, allowedDelayMs?: number): void 

3.5 注册事件通知回调

SubscribeType 描述订阅类型。

  • 0: SUBSCRIBE_TYPE_LOCAL 表示订阅本地数据变更。
  • 1: SUBSCRIBE_TYPE_REMOTE 表示订阅远端数据变更。
  • 2: SUBSCRIBE_TYPE_ALL 表示订阅远端和本地数据变更。
  1. kvStore.on(event: 'dataChange', type: SubscribeType, observer: Callback<ChangeNotification>): void 
  2. kvStore.on(event: 'syncComplete', syncCallback: Callback<Array<[string, number]>>): void 

4 小结

以上步骤,均已在DevEco Studio 3.0.0.600 x64中编写成功,并且在两台Hi3516D设备间成功运行,附代码(分布式任务调度和分布式数据测试.zip)。

再次提醒,分布式数据底层依赖ARK JS引擎,目前发现字符串处理有BUG,如运行出现问题,请先合并PR,然后重新编译全系统并刷机后再运行DEMO。

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.IDC.NET

 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/259122.html<

(0)
运维的头像运维
上一篇2025-05-02 13:26
下一篇 2025-05-02 13:27

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注