《HarmonyOS 7 跨设备数据协同专题》04:DistributedKVStore 的 PUSH、PULL 与最终一致性【鸿蒙心迹】
鸿蒙领航者
·
手机改了,平板也改了,最后谁覆盖谁?

前三篇做的都是实时内存同步,适合正在编辑的笔记。这篇做持久化:大量笔记记录,要存到数据库里,跨设备同步。
最开始以为:同步就是把两边数据合一下就行。结果两边都改了同一条记录,到底听谁的?
一、分布式 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。有些场景只推或者只拉就够了。
第二个坑:把同步完成理解成强一致。同步完也可能有冲突。
第三个坑:设备离线疯狂重试。离线了就别一直重试,等连上再同步。
第四个坑:大量数据每次全量同步。数据量大会很慢。
五、冲突怎么处理
两边都改了同一条记录,冲突怎么办?
正确的做法是:加版本字段或者更新时间。谁更新时间新,听谁的。

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


所有评论(0)