分布式数据管理真就“把数据同步过去”这么简单?冲突、分级、权限一上来你就知道痛了…

举报
bug菌 发表于 2025/12/25 11:41:18 2025/12/25
【摘要】 🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8 🧡前言:先说句大实话分布式数据这块,Demo 阶段像魔法✨:A 设备...

🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

🧡前言:先说句大实话

分布式数据这块,Demo 阶段像魔法✨:A 设备改一下,B 设备立刻跟着变;
但一到业务就开始“社会毒打”💥:

  • 同一个 key 两台设备同时改,谁赢?
  • 数据安全等级不匹配,凭啥给你同步?
  • 权限没弹、用户没授权、设备不可信,怎么就想跨端“搬数据”?😅

所以咱这节不玩虚的,按三件套 + 一条底线讲清楚:
✅ 分布式数据库(KV / RDB) → ✅ 跨设备同步 → ✅ DistributedDataObject → ✅ 权限与分级控制

🧭0) 先选型:你到底要同步“什么形态的数据”?🤔

🗃️A. 分布式 KV(distributedKVStore)

  • 适合:偏好设置、轻量状态、小体量结构数据
  • 特点:接口简单、同步方便、监听清晰
  • 关键能力:sync()on('dataChange')、安全等级、手动/自动同步开关等

🧾B. 分布式关系型(relationalStore 的分布式表)

  • 适合:订单/联系人/结构化数据、需要 SQL 查询/事务
  • 特点:先把表设为分布式表,再 sync(),还能拿远端分布式表名做跨端查询

🧠C. DistributedDataObject(分布式数据对象)

  • 适合:多端协同的“实时状态变量”(进度、选中项、编辑状态)
  • 特点:像改本地对象属性一样同步;同步最小单位是“属性”;但有容量与场景限制

🗃️1) 分布式数据库:KV 你得先分清“单版本 vs 协同库”😄

1.1 两种库类型(超关键)

  • SINGLE_VERSION(单版本):不区分设备,同 key 会互相覆盖(典型“最后写入者赢”)
  • DEVICE_COLLABORATION(设备协同):以设备维度管理数据,冲突更少,还能按设备维度查

😏人话:
单版本像“群共享文档”;协同库像“每台设备一份账本”。

1.2 KV 的硬指标(别拿它当网盘…)

  • key 最大 1024B;value 最大 4194303B(≈4MB-1)
  • 设备协同库 key 最大 896B

1.3 KV 示例:创建 + put/get + 监听 + 同步(ArkTS)

import { distributedKVStore } from '@kit.ArkData';
import type { BusinessError } from '@kit.BasicServicesKit';

export async function openAndSyncKV(context: any, deviceIds: string[]) {
  const kvManager = distributedKVStore.createKVManager({
    context,
    bundleName: context.bundleName
  });

  // ⚠️securityLevel 必填;kvStoreType 选你业务需要的
  const options: distributedKVStore.Options = {
    createIfMissing: true,
    encrypt: true,
    kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION,
    securityLevel: distributedKVStore.SecurityLevel.S2
  };

  const store = await kvManager.getKVStore('demo_store', options);

  store.on('dataChange', distributedKVStore.SubscribeType.SUBSCRIBE_TYPE_ALL, (chg) => {
    console.info(`🔔 dataChange from=${chg.deviceId}, insert=${chg.insertEntries.length}, update=${chg.updateEntries.length}`);
  });

  await store.put('nickname', '小鸿同学😄');
  console.info(`✅ local get = ${await store.get('nickname')}`);

  // PUSH_PULL:先推再拉
  await store.sync(deviceIds, distributedKVStore.SyncMode.PUSH_PULL);
}

KV 的 sync()、监听、类型枚举、常量限制都在官方 API 里写得很清楚。

🧾2) 分布式数据库:RDB(关系型)同步要记住“三步走”🧠

2.1 三步走(不走就别问为啥不同步😂)

  1. getRdbStore() 打开库
  2. 把表设为分布式表setDistributedTables()
  3. sync() 触发跨设备同步,并用 on('dataChange') 监听变化

2.2 RDB 示例:建表 + 设分布式表 + 同步

import { relationalStore } from '@kit.ArkData';

export async function rdbDistributedSync(context: any, deviceIds: string[]) {
  const store = await relationalStore.getRdbStore(context, {
    name: 'demo.db',
    securityLevel: relationalStore.SecurityLevel.S2
  });

  // 建表(示例)
  await store.execute(`CREATE TABLE IF NOT EXISTS user(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INTEGER
  )`);

  // ⭐关键:设分布式表
  await store.setDistributedTables(['user']);

  store.on('dataChange', (info) => {
    console.info(`🔔 rdb dataChange = ${JSON.stringify(info)}`);
  });

  await store.execute(`INSERT INTO user(name, age) VALUES(?, ?)`, ['Precious😄', 18]);

  // ⭐关键:触发同步
  await store.sync(deviceIds, relationalStore.SyncMode.PUSH_PULL);
}

setDistributedTables / obtainDistributedTableName / sync / dataChange 这些都是 RdbStore 接口的一部分。

🧷小补充:
跨设备查询远端表时,通常需要 obtainDistributedTableName() 拿远端“分布式表名”再查。

🧠3) DistributedDataObject:把“变量”变成跨设备共享状态,爽但有规矩😄

3.1 它到底是什么?

官方的意思很直白:

  • 它把数据缓存到分布式内存数据库,并把 JS 对象属性的 get/set 映射成底层 put/get;
  • 不同设备只要设置相同 sessionId 就能自动同步;
  • 能监听 change(属性变更)和 status(设备上下线)。

3.2 约束(别忽略!忽略你就会炸😵)

  • 只能用于跨端迁移、或通过跨设备 Call 的多端协同场景
  • 同步最小单位是“属性”;复杂对象只支持改根属性,不支持改深层字段
  • 建议别创建太多:单应用最多 16 个对象实例;单对象约占 100–150KB 内存;单对象大小不超过 500KB;建议协同设备数不超过 3 台

3.3 DataObject 示例:create + sessionId + 监听 + 修改属性

import { distributedDataObject } from '@kit.ArkData';

type Shared = { progress: number; message?: string };

export async function runDataObject(context: any) {
  const data: Shared = { progress: 0, message: '准备同步🚀' };
  const obj = distributedDataObject.create(context, data);

  const sid = distributedDataObject.genSessionId();
  await obj.setSessionId(sid); // 两台设备要用同一个 sid

  obj.on('change', (sessionId, fields) => {
    console.info(`🔔 change sid=${sessionId}, fields=${JSON.stringify(fields)}`);
    console.info(`📌 now progress=${(obj as any).progress}, message=${(obj as any).message}`);
  });

  obj.on('status', (sessionId, networkId, status) => {
    console.info(`🌐 status sid=${sessionId}, device=${networkId}, ${status}`);
  });

  // 像改本地变量一样改它
  (obj as any).progress = 42;
  (obj as any).message = '已经在路上啦😄';
}

接口(create/genSessionId/setSessionId/on change/status)和场景限制都在官方指南/API 里明确写了。

🔐4) 权限控制 + 分级访问:这才是分布式数据真正的“门神”🧱

4.1 ohos.permission.DISTRIBUTED_DATASYNC:常见必需权限

比如 KV 的 autoSync 能力就明确要求 ohos.permission.DISTRIBUTED_DATASYNC
在 OpenHarmony/文档示例里,分布式数据对象同步同样提到需要该权限并向用户申请授权。

4.2 数据安全标签 × 设备安全等级:不匹配就别想同步😅

分布式数据管理提供按数据安全标签 + 设备安全等级的访问控制:等级越高,加密与访问控制越严格;数据分为 S1–S4 四级。

😏人话:
高敏数据(S3/S4)不是“你想同步到哪台设备就同步到哪台设备”。
设备达不到安全等级、策略不允许,系统会拦你,这是好事,不然就成“分布式泄露”了…

⚡5) 我给你一份“工程落地”小抄(真能救命那种)🧯

  • 先手动 sync,再考虑 autoSync:自动同步只在特定场景生效(跨设备 Call 的协同里才明显)
  • 冲突策略别装没看见:SINGLE_VERSION 同 key 覆盖是天然行为,业务要么接受,要么用“带时间戳/版本号的 key”绕开
  • 监听回调里别做重活dataChange/change 里只做轻处理,重活丢队列/做节流(不然同步很快,UI 很卡)
  • 安全等级选对:从 S2 起步更常见;涉及定位/轨迹更偏 S3;特别敏感走 S4(并配合更严格的访问控制)

🧧福利赠与你🧧

  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」专栏(全网一个名),bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

✨️ Who am I?

我是bug菌(全网一个名),CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主/价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。