手机改了,平板也改了,最后谁覆盖谁?

文章封面

前三篇做的都是实时内存同步,适合正在编辑的笔记。这篇做持久化:大量笔记记录,要存到数据库里,跨设备同步。

最开始以为:同步就是把两边数据合一下就行。结果两边都改了同一条记录,到底听谁的?

一、分布式 KVStore 是什么

分布式 KVStore 就是一个键值数据库,数据可以跨设备同步。

和分布式数据对象不一样:数据对象是内存里的,实时同步;KVStore 是持久化的,存在本地数据库,然后按策略同步。

类型存储方式同步方式
DistributedDataObject内存实时同步
DistributedKVStore本地数据库按策略同步

二、三种同步模式

手动同步的时候,有三种模式:

模式方向说明
PUSH_ONLY只推把本地数据推给对端
PULL_ONLY只拉从对端拉数据下来
PUSH_PULL双向两边数据互相同步

这段代码解决什么问题: 手动同步 KVStore。
文件: distributed/NoteStore.ets
用途: 持久化笔记同步
接入位置: 网络恢复后

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

// 手动同步
kvStore.sync(deviceIds, 
  distributedKVStore.SyncMode.PUSH_PULL,
  (err, result) => {
    if (err) {
      console.error('同步失败');
      return;
    }
    console.log('同步完成:', result);
  }
);

业务流程图

三、最终一致性是什么意思

同步完成了,不是说两边数据完全一样。是最终一致。

意思是:现在可能不一样,过一会儿同步完了就一样了。不是强一致。

四、几个容易踩的坑

第一个坑:什么情况都用 PUSH_PULL。有些场景只推或者只拉就够了。

第二个坑:把同步完成理解成强一致。同步完也可能有冲突。

第三个坑:设备离线疯狂重试。离线了就别一直重试,等连上再同步。

第四个坑:大量数据每次全量同步。数据量大会很慢。

五、冲突怎么处理

两边都改了同一条记录,冲突怎么办?

正确的做法是:加版本字段或者更新时间。谁更新时间新,听谁的。

运行效果图

这次做持久化同步最大的体会是:持久化同步不是实时内存同步,是按策略同步的。要考虑弱网、离线、冲突这些情况,不是"同步一下就完事了"。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐