数据同步技术实现方案
最后更新日期: 2017-11-12
客户端同步业务实现标准
-
1.客户端使用本地数据库存储数据.
-
2.客户端支持全量和增量同步.
-
3.支持在不可靠网络环境下错误后恢复重传.
-
4.允许特殊状态下版本的不一致,即最后更新的为最新.
同步流程
同步流程中所有同步数据都使用一个基于帐号的全局同步序号 USN(Update Sequence Number) 来记录用户的同步数据状态,服务端不存储同步数据的中间状态(历史版本).可以通过同步序号USN来确定那个数据被修改的先后时间.
一个帐号只有一个同步序号 USN, USN 从 1 开始.新帐号创建第一条记录的 USN 为1.每次对每条数据的增,删,改都会增加 USN.帐号的最大 USN 通过[getSyncState]接口的updateCount字段返回.
服务端不处理数据的冲突,同步方案将所有的记录和冲突解决方案推送到客户端处理,以便服务端可以以"可伸缩","无状态"方式执行同步.
客户端同步步骤:
-
1.获取同步数据列表,包括更新和修改的数据.
-
2.保存数据到本地数据库,数据处理(排重,冲突处理等).
-
3.上传本地修改到服务端.
-
4.本地记录同步状态值以便后面增量同步.
同步流程伪代码:
客户端状态:
lastUpdateCount 最后同步的序列号.
lastSyncTime 最后全量同步的时间(服务端时间).
【用户登录】
Step1.登陆获取access_token
Step2.首次同步,进行【全量同步】
Step3.根据返回状态信息同步
if ( fullSyncBefore > lastSyncTime ){
//【全量同步】
}
if ( updateCount = lastUpdateCount ){
// 服务端没有更新,直接【上传更新】
}else{
//【增量同步】
}
【全量同步】
Step4. 调用 syncPull 加载同步数据,参数 afterUSN = 0. syncPull 接口返回同步数据的摘要数据,如资源的描述信息等.文件等信息需要独立请求下载.返回数据包括被删除数据(主要字段guid)
syncPull 接口返回同步数据的摘要数据,如资源的描述信息等.文件等信息需要独立请求下载.返回数据包括被删除数据(主要字段guid)
Step5. 同步中客户端数据合并处理
-
i. 如果一个标签(如帐本分类标签)在同步数据中,但是本地数据库不存在,则直接在本地数据库中创建.如果本地数据库中已经存在同名的标签(GUID不一样):
-
a> 如果本地的标签数据是被修改过的(有标记needpush,需要被上传修改的),用户在其他客户端离线的时候使用相同的名称创建了一个标签.则执行合并或者冲突处理(保留线上,或者删除其中一个).
-
b> 重命名本地的原有标签名.如自动命名为:标签(2).
-
-
ii. 如果客户端上存在标签,但服务器上不存在:
-
a> 如果客户端的标签是没有被修改过的标记needpush(不需要上传同步),或者已经被上传到服务器了,直接从客户端删除标签。
-
b> 否则:标签是客户端新建的数据,有needpush标记,稍后调用【同步上传】中完成上传数据.
-
-
iii. 如果客户端上和服务器上都存在标签(GUID相同):
-
a> 如果"USN"相同并且本地数据没有needpush标记,则数据处于同步状态.
-
b> 如果"USN"相同,但是本地数据有needpush标记,则数据稍后在【同步上传】中完成上传数据.
-
c> 如果服务端同步数据的"USN"大于本地数据的USN,并且本地数据没有needpush标记,直接使用服务端数据覆盖本地数据.
-
d> 如果服务端同步数据的USN大于本地数据的USN,并且本地数据有needpush标记,表示服务端和本地都有修改这个数据,需要进行冲突处理.冲突处理细节根据具体业务逻辑不一样处理方式不一样.
-
Step6. 客户端对服务器的数据完成合并处理后,客户端存储服务器的updatecount到lastupdatecount和服务器的当前时间lastsynctime(全量同步存lastsynctime).
Step7. 执行【同步上传】.
【增量同步】
Step8. 执行步骤4, afterUSN=lastUpdateCount. deleted
Step9. 合并新增和修改到本地客户端数据库
-
i. 同步骤5的处理
-
ii. 删除数据处理
-
a> 服务端同步数据的USN大于本地数据的USN,并且deleted大于0,则为服务器端标记为删除的数据,本地数据无needpush标记,直接从本地删除.
-
b> 服务端同步数据的USN大于本地数据的USN,并且deleted大于0,则为服务器端标记为删除的数据,本地数据有needpush标记,需要进行冲突处理.(简单处理为忽略本地修改,直接删除,或者本地的修改创建为一个新记录)
-
Step10. 客户端对服务器的数据完成合并处理后,客户端存储服务器的updatecount到lastupdatecount和服务器的当前时间lastsynctime(全量同步存lastsynctime).
Step11.执行【同步上传】.
【同步上传】
Step12.遍历本地标记为needpush的数据:
-
a> 本地数据没有USN字段,为创建的新数据.如果是个冲突需要处理的,客户端需要处理冲突,更新本地数据.
-
b> 其他更新数据需要上传的上传数据到服务器.
-
c> 需要删除的数据调用[syncDelete]接口完成删除操作.