如何确保PouchDB/CouchDB的复制操作成功执行?
解决方案
你不需要额外判断上一次复制是否中断,PouchDB和CouchDB的复制检查点是持久化存储在源库和目标库的系统文档中的,和应用进程状态无关。只要你下次对相同的源、目标库调用PouchDB.replicate(),会自动从上次的断点继续执行,不会重复同步已经拉取过的文档,针对你的小体量低变更场景,这个机制完全足够。
你可以将思路1和思路3结合做优化,既可控同步时机,又能保证可靠性:
- 为每个库在LocalStorage或专门的本地元数据表中存储三个字段:
lastSyncTriggerTime(上次触发同步的时间)、lastSyncSuccessTime(上次同步完成的时间)、lastRemoteSeq(上次同步成功时远程库的update_seq) - 仅在你需要的时机触发同步:比如用户主动点击同步按钮、应用进入空闲状态、定时检查到远程库的update_seq和本地存储的
lastRemoteSeq不一致时,再调用PouchDB.replicate(),完全可控拉取时机,不需要启动就全量执行 - 同步启动时更新
lastSyncTriggerTime,同步触发complete事件时,更新lastSyncSuccessTime和lastRemoteSeq,触发error事件时可以存储错误信息用于排查 - 你可以用
lastSyncTriggerTime和lastSyncSuccessTime的对比给用户做状态提示(比如「上次同步未完成,点击继续」),但同步逻辑本身不需要依赖这个判断,直接调用PouchDB.replicate()即可自动处理断点续传
其他思路的补充说明
- 不需要开启
live和retry配置,这两个参数针对实时同步场景,你的一次性拉取场景用不到,反而会额外占用资源 - 不要依赖未公开的
pending属性,该属性属于内部实现细节,后续版本可能发生变更,稳定性没有保障 - 服务端的Replicator数据库不适合你的客户端拉取场景,无需额外接入未维护的第三方插件
内容的提问来源于stack exchange,提问作者mugwhump
相关产品推荐
相关产品推荐

