数据同步技术实现方案

最后更新日期: 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]接口完成删除操作.

原文地址:https://www.cnblogs.com/gaox97329498/p/11914056.html