一、简介

① 基本概念
  • 分布式数据服务(Distributed Data Service,DDS) 为应用程序提供不同设备间数据库数据分布式的能力。通过调用分布式数据接口,应用程序将数据保存到分布式数据库中。通过结合帐号、应用和数据库三元组,分布式数据服务对属于不同的应用的数据进行隔离,保证不同应用之间的数据不能通过分布式数据服务互相访问。在通过可信认证的设备间,分布式数据服务支持应用数据相互同步,为用户提供在多种终端设备上一致的数据访问体验。
  • KV 数据模型:
    • “KV数据模型”是“Key-Value数据模型”的简称,“Key-Value”即“键-值”。它是一种 NoSQL 类型数据库,其数据以键值对的形式进行组织、索引和存储。
    • KV 数据模型适合不涉及过多数据关系和业务关系的业务数据存储,比 SQL 数据库存储拥有更好的读写性能,同时因在分布式场景中降低了数据库版本兼容和数据同步过程中冲突解决的复杂度而被广泛使用。分布式数据库也是基于 KV 数据模型,对外提供 KV 类型的访问接口。
  • 分布式数据库事务性:分布式数据库事务支持本地事务(和传统数据库的事务概念一致)和同步事务,同步事务是指在设备之间同步数据时,是以本地事务为单位进行同步,一次本地事务的修改要么都同步成功,要么都同步失败。
  • 分布式数据库一致性:在分布式场景中一般会涉及多个设备,组网内设备之间看到的数据是否一致称为分布式数据库的一致性。分布式数据库一致性可以分为强一致性、弱一致性和最终一致性。
    • 强一致性:是指某一设备成功增、删、改数据后,组网内设备对该数据的读取操作都将得到更新后的值。
    • 弱一致性:是指某一设备成功增、删、改数据后,组网内设备可能能读取到本次更新数据,也可能读取不到,不能保证在多长时间后每个设备的数据一定是一致的。
    • 最终一致性:是指某一设备成功增、删、改数据后,组网内设备可能读取不到本次更新数据,但在某个时间窗口之后组网内设备的数据能够达到一致状态。
    • 强一致性对分布式数据的管理要求非常高,在服务器的分布式场景可能会遇到。因为移动终端设备的不常在线、以及无中心的特性,分布式数据服务不支持强一致,只支持最终一致性。
  • 分布式数据库同步
    • 底层通信组件完成设备发现和认证,会通知上层应用程序(包括分布式数据服务)设备上线。收到设备上线的消息后分布式数据服务可以在两个设备之间建立加密的数据传输通道,利用该通道在两个设备之间进行数据同步。
    • 分布式数据服务提供了两种同步模式:手动同步和自动同步模式。手动同步模式完全由应用程序调用接口来触发,并且支持指定同步的设备列表和同步模式(PULL、 PUSH 和 PULL_PUSH 三种同步模式)。自动同步模式由分布式数据库来完成数据同步(同步时机包括设备上线、应用程序修改数据等),业务不感知同步操作。
  • 单版本分布式数据库:单版本是指数据在本地保存是以单个 KV 条目为单位的方式保存,对每个 Key 最多只保存一个条目项,当数据在本地被用户修改时,不管它是否已经被同步出去,均直接在这个条目上进行修改。同步也以此为基础,按照它在本地被写入或更改的顺序将当前最新一次修改逐条同步至远端设备。
  • 设备协同分布式数据库:设备协同分布式数据库建立在单版本分布式数据库之上,对应用程序存入的 KV 数据中的 Key 前面拼接了本设备的 DeviceID 标识符,这样能保证每个设备产生的数据严格隔离,底层按照设备的维度管理这些数据,设备协同分布式数据库支持以设备的维度查询分布式数据,但是不支持修改远端设备同步过来的数据。
  • 分布式数据库冲突解决策略:分布式数据库多设备提交冲突场景,在给提交冲突做合并的过程中,如果多个设备同时修改了同一数据,则称这种场景为数据冲突。数据冲突采用默认冲突解决策略,基于提交时间戳,取时间戳较大的提交数据,当前不支持定制冲突解决策略。
  • 数据库 Schema 化管理与谓词查询:单版本数据库支持在创建和打开数据库时指定Schema,数据库根据 Schema 定义感知 KV 记录的 Value 格式,以实现对 Value 值结构的检查,并基于 Value 中的字段实现索引建立和支持谓词查询。
  • 分布式数据库备份能力:提供分布式数据库备份能力,业务通过设置 backup 属性为 true,可以触发分布式数据服务每日备份。当分布式数据库发生损坏,分布式数据服务会删除损坏数据库,并且从备份数据库中恢复上次备份的数据。如果不存在备份数据库,则创建一个新的数据库。同时支持加密数据库的备份能力。
② 运作机制
  • 分布式数据服务支撑 HarmonyOS 系统上应用程序数据库数据分布式管理,支持数据在相同帐号的多端设备之间相互同步,为用户在多端设备上提供一致的用户体验,分布式数据服务包含五部分:
    • 服务接口:分布式数据服务提供专门的数据库创建、数据访问、数据订阅等接口给应用程序调用,接口支持 KV 数据模型,支持常用的数据类型,同时确保接口的兼容性、易用性和可发布性。
    • 服务组件:服务组件负责服务内元数据管理、权限管理、加密管理、备份和恢复管理以及多用户管理等、同时负责初始化底层分布式 DB 的存储组件、同步组件和通信适配层。
    • 存储组件:存储组件负责数据的访问、数据的缩减、事务、快照、数据库加密,以及数据合并和冲突解决等特性。
    • 同步组件:同步组件连结了存储组件与通信组件,其目标是保持在线设备间的数据库数据一致性,包括将本地产生的未同步数据同步给其他设备,接收来自其他设备发送过来的数据,并合并到本地设备中。
    • 通信适配层:通信适配层负责调用底层公共通信层的接口完成通信管道的创建、连接,接收设备上下线消息,维护已连接和断开设备列表的元数据,同时将设备上下线信息发送给上层同步组件,同步组件维护连接的设备列表,同步数据时根据该列表,调用通信适配层的接口将数据封装并发送给连接的设备。
  • 应用程序通过调用分布式数据服务接口实现分布式数据库创建、访问、订阅功能,服务接口通过操作服务组件提供的能力,将数据存储至存储组件,存储组件调用同步组件实现将数据同步,同步组件使用通信适配层将数据同步至远端设备,远端设备通过同步组件接收数据,并更新至本端存储组件,通过服务接口提供给应用程序使用。
  • 数据分布式运作示意图如下:

③ 使用限制
  • 应用程序如需使用分布式数据服务完整功能,需要申请 ohos.permission.DISTRIBUTED_DATASYNC 权限。
  • 分布式数据服务的数据模型仅支持 KV 数据模型,不支持外键、触发器等关系型数据库中的技术点。
  • 分布式数据服务支持的 KV 数据模型规格:
    • 设备协同数据库,Key 最大支持 896Byte,Value 最大支持 4MB - 1Byte。
    • 单版本数据库,Key 最大支持 1KB,Value 最大支持 4MB - 1Byte。
    • 每个应用程序最多支持同时打开 16 个 KvStore。
  • 由于支持的存储类型不完全相同等原因,分布式数据服务无法完全代替业务沙箱内数据库数据的存储功能,开发人员需要确定要做分布式同步的数据,把这些数据保存到分布式数据服务中。
  • 分布式数据服务当前不支持应用程序自定义冲突解决策略。
  • 分布式数据服务当前流控机制针对 KvStore 的接口 1 秒最大访问 1000 次,1 分钟最大访问 10000 次。KvManager 的接口 1 秒最大访问 50 次,1 分钟最大访问 500 次。
  • 如果需要在分布式数据库事件回调的方法里修改 UI 组件,建议使用 UITaskDispatcher 机制。
④ 应用场景
  • 分布式数据服务主要实现对用户设备中应用程序的数据内容的分布式同步。
  • 当设备 1 上的应用 A 在分布式数据库中增、删、改数据后,设备 2 上的应用 A 也可以获取到该数据库变化。可在分布式图库、信息、通讯录、文件管理器等场景中使用。

二、分布式数据服务 API

  • HarmonyOS 系统中的分布式数据服务模块为开发者提供下面几种功能:
功能分类 接口名称 描述
分布式数据库创建、打开、关闭和删除 isCreateIfMissing() 检查数据库不存在时是否创建
setCreateIfMissing(boolean isCreateIfMissing) 设置数据库不存在时是否创建
isEncrypt() 获取数据库是否加密
setEncrypt(boolean isEncrypt) 设置数据库是否加密
getStoreType() 获取分布式数据库的类型
setStoreType(KvStoreType storeType) 设置分布式数据库的类型
KvStoreType.DEVICE_COLLABORATION 设备协同分布式数据库类型
KvStoreType.SINGLE_VERSION 单版本分布式数据库类型
getKvStore(Options options, String storeId) 根据Options配置创建和打开标识符为storeId的分布式数据库
closeKvStore(KvStore kvStore) 关闭分布式数据库
deleteKvStore(String storeId) 删除分布式数据库
分布式数据增、删、改、查 getStoreId() 根据配置构造帐号键值数据库管理类实例
putBoolean(String key, boolean value)
putInt(String key, int value)
putFloat(String key, float value)
putDouble(String key, double value)
putString(String key, String value)
putByteArray(String key, byte[] value)
putBatch(List entries)
插入和更新数据
delete(String key)
deleteBatch(List keys)
删除数据
getInt(String key)
getFloat(String key)
getDouble(String key)
getString(String key)
getByteArray(String key)
getEntries(String keyPrefix)
查询数据
分布式数据谓词查询 select()
reset()
equalTo(String field, int value)
equalTo(String field, long value)
equalTo(String field, double value)
equalTo(String field, String value)
equalTo(String field, boolean value)
notEqualTo(String field, int value)
notEqualTog(String field, long value)
notEqualTo(String field, boolean value)
notEqualTo(String field, String value)
notEqualTo(String field, double value)
greaterThan(String field, int value)
greaterThan(String field, long value)
greaterThan(String field, double value)
greaterThan(String field, String value)
lessThan(String field, int value)
lessThan(String field, long value)
lessThan(String field, double value)
lessThan(String field, String value)
greaterThanOrEqualTo(String field, int value)
greaterThanOrEqualTo(String field, long value)
greaterThanOrEqualTo(String field, double value)
greaterThanOrEqualTo(String field, String value)
lessThanOrEqualTo(String field, int value)
lessThanOrEqualTo(String field, long value)
lessThanOrEqualTo(String field, double value)
lessThanOrEqualTo(String field, String value)
isNull(String field)
orderByDesc(String field)
orderByAsc(String field)
limit(int number, int offset)
like(String field, String value)
unlike(String field, String value)
inInt(String field, List valueList)
inLong(String field, List valueList)
inDouble(String field, List valueList)
inString(String field, List valueList)
notInInt(String field, List valueList)
notInLong(String field, List valueList)
notInDouble(String field, List valueList)
notInString(String field, List valueList)
and()
or()
对于Schema数据库谓词查询数据
订阅分布式数据变化 subscribe(SubscribeType subscribeType, KvStoreObserver observer) 订阅数据库中数据的变化
分布式数据同步 sync(List deviceIdList, SyncMode mode) 在手动模式下,触发数据库同步

三、分布式数据服务使用流程

① 根据配置构造分布式数据库管理类实例
  • 根据应用上下文创建 KvManagerConfig 对象。
  • 创建分布式数据库管理器实例。
  • 以下为创建分布式数据库管理器的代码示例:
 Context context;...KvManagerConfig config = new KvManagerConfig(context);KvManager kvManager = KvManagerFactory.getInstance().createKvManager(config);
② 获取/创建单版本分布式数据库
  • 声明需要创建的单版本分布式数据库 ID 描述。
  • 创建单版本分布式数据库,跨设备自动同步数据库功能默认开启。
  • 以下为创建单版本分布式数据库的代码示例:
 Options CREATE = new Options();CREATE.setCreateIfMissing(true).setEncrypt(false).setKvStoreType(KvStoreType.SINGLE_VERSION);String storeID = "testApp";SingleKvStore singleKvStore = kvManager.getKvStore(CREATE, storeID);
③ 订阅分布式数据变化
  • 客户端需要实现 KvStoreObserver 接口。
  • 构造并注册 KvStoreObserver 实例。
  • 以下为订阅单版本分布式数据库所有(本地及远端)数据变化通知的代码示例:
 class KvStoreObserverClient implements KvStoreObserver {@Overridepublic void onChange(ChangeNotification notification) {List<Entry> insertEntries = notification.getInsertEntries();List<Entry> updateEntries = notification.getUpdateEntries();List<Entry> deleteEntries = notification.getDeleteEntries();}}KvStoreObserver kvStoreObserverClient = new KvStoreObserverClient();singleKvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_ALL, kvStoreObserverClient);
④ 将数据写入单版本分布式数据库
  • 构造需要写入单版本分布式数据库的 Key(键)和 Value(值)。
  • 将键值数据写入单版本分布式数据库。
  • 以下为将字符串类型键值数据写入单版本分布式数据库的代码示例:
 String key = "todayWeather";String value = "Sunny";singleKvStore.putString(key, value);
⑤ 查询单版本分布式数据库数据
  • 构造需要从单版本分布式数据库快照中查询的 Key(键)。
  • 从单版本分布式数据库快照中获取数据。
  • 以下为从单版本分布式数据库中查询字符串类型数据的代码示例:
 String key = "todayWeather";String value = singleKvStore.getString(key);
⑥ 同步数据到其他设备
  • 获取已连接的设备列表。
  • 选择同步方式进行数据同步。
  • 以下为单版本分布式数据库进行数据同步的代码示例,其中同步方式为 PUSH_ONLY:
 List<DeviceInfo> deviceInfoList = kvManager.getConnectedDevicesInfo(DeviceFilterStrategy.NO_FILTER);List<String> deviceIdList = new ArrayList<>();for (DeviceInfo deviceInfo : deviceInfoList) {deviceIdList.add(deviceInfo.getId());}singleKvStore.sync(deviceIdList, SyncMode.PUSH_ONLY);
⑦ 关闭单版本分布式数据库
  • 以下为关闭单版本分布式数据库的代码示例:
 kvManager.closeKvStore(singleKvStore);
⑧ 删除单版本分布式数据库
  • 以下为删除单版本分布式数据库的代码示例:
 kvManager.deleteKvStore(storeID);

HarmonyOS之数据管理·分布式数据服务的应用相关推荐

  1. 健康大数据管理与服务类毕业论文文献都有哪些?

    本文是为大家整理的健康大数据管理与服务主题相关的10篇毕业论文文献,包括5篇期刊论文和5篇学位论文,为健康大数据管理与服务选题相关人员撰写毕业论文提供参考. 1.[期刊论文]疾病预警在健康大数据管理平 ...

  2. 【FFH】分布式数据服务简单实现(OpenHarmony JS UI版)

    [FFH]分布式数据服务简单实现(OpenHarmony JS UI版) Demo效果展示 分布式数据服务概述 KV数据模型 分布式数据库同步 单版本分布式数据库 设备协同分布式数据库 代码封装 导入 ...

  3. 银行选型和排坑实战:用开源软件自建分布式数据服务平台

    来自:DBAplus社群 之前设计篇讲了数据拆分的方式.场景.优缺点以及实施步骤,偏方法与理论.技术篇会介绍分布式数据服务平台设计与实现,讲述如何通过技术手段解决数据拆分带来的各种问题,以及各中间件的 ...

  4. 李飞飞演讲实录 | 云原生数据库2.0:一站式全链路数据管理与服务

    简介:5月29日阿里云开发者大会上,阿里巴巴集团副总裁.阿里云数据库产品事业部负责人李飞飞演讲实录. 一.浅谈云原生 (一)云原生,是未来使用云的标准方式 我认为云原生是未来使用云的标准方式,云计算资 ...

  5. 云原生数据库 2.0:一站式全链路数据管理与服务

    简介:5月29日,阿里云开发者大会上,阿里云数据库宣布「云原生数据库 2.0:一站式全链路数据管理与服务」的全新品牌理念及开源云原生数据库能力,首次从客户场景视角提出了一站式在线数据管理平台的理念. ...

  6. 李飞飞:一站式全链路数据管理与服务成为产业布局重点

    12月23-24日,2021数据技术嘉年华(DTC)将通过墨天轮社区线上举办.围绕"智能·创新·新生态--数据智领未来 生态共创价值"这一主题,来自数据领域的领军人物.学术精英.技 ...

  7. HarmonyOS之数据管理·分布式文件服务的应用

    一.简介 ① 基本概念 分布式文件服务能够为用户设备中的应用程序提供多设备之间的文件共享能力,支持相同帐号下同一应用文件的跨设备访问,应用程序可以不感知文件所在的存储设备,能够在多个设备之间无缝获取文 ...

  8. 媒体声音|阿里云数据库:一站式全链路数据管理与服务,引领云原生2.0时代

    简介:引领云原生数据库技术持续创新 这几年,云原生已成为阿里云的另一个标签,不仅最早布局云原生技术,拥有大量客户实践,更打造出丰富的云原生产品家族.尤其是数据库产品线,已进入云原生2.0阶段,通过全链 ...

  9. HarmonyOS之深入解析服务卡片的使用

    一.概述 ① 基本概念 服务卡片(以下简称"卡片")是 FA 的一种界面展示形式,将 FA 的重要信息或操作前置到卡片,以达到服务直达,减少体验层级的目的. 卡片常用于嵌入到其他应 ...

最新文章

  1. windows 64位 dll文件 位置及python包rtree shapely安装
  2. 如何测试一个空的JavaScript对象?
  3. java 二维数组内存溢出_模拟Java内存溢出
  4. sketch生成android代码,java – 从Android Processing Sketch保存图像
  5. Python02期(北京)课程笔记索引
  6. 2-1:套接字(Socket)编程之必备知识
  7. 【开源】本周不容错过开源论文,含分割、检索、神经渲染、deepfake 检测、超分、视频相关等...
  8. 把人工智能、机器学习、深度学习串一串,串一个同心圆
  9. excel去重_Python 轻松搞定 Excel 常用的 20 个操作
  10. 用Winhex手工定位NTFS文件系统下的文件
  11. snoopy php https_php使用snoopy与curl模拟登陆的实例分享
  12. Atlas 200DK 安装ROS教程
  13. 10种web前端开发可视化在线工具大全
  14. 杭州第二机场选址的三个备选方案仁和、瓶窑、塘栖中选择瓶窑的理由。元芳,你怎么看?
  15. exFAT硬盘写保护修复远程登录提示到期
  16. 微软“玻璃硬盘”问世:2毫米杯垫大小可存储75.8G数据,1000年不坏!
  17. java毕业设计茶叶销售网站Mybatis+系统+数据库+调试部署
  18. 堆的进化之旅5-Relaxed Heap松弛堆
  19. 网络文件系统——上(samba,NFS,实现网络共享文件)
  20. uniapp移除原生导航栏后页面与手机状态栏重叠问题

热门文章

  1. urllib2 python3错误?用from urllib import request来代替!
  2. thinkphp模版常量替换机制
  3. [c/c++] programming之路(7)、数据类型转换、偷钱小程序、进制转换
  4. FFmpeg学习1:视频解码
  5. flask开发restful api系列(5)-短信验证码
  6. 【读书笔记】基础博弈知识小结
  7. 基于J2EE+JBPM3.x/JBPM4.3+Flex流程设计器+Jquery+授权认证)企业普及版贝斯OA与工作流系统...
  8. linux目录所属用户和组,管理用户所属的用户组《 Linux 文件与目录权限 》
  9. teledb兼容mysql5.7_maridb安装
  10. Jquery日历编写小练习