zoukankan      html  css  js  c++  java
  • 数据同步技术实现方案

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

  • 相关阅读:
    golang 常见疑惑总结
    golang 详解defer
    golang调试工具Delve
    ACE的源码划分
    通过#define连接字符串的特殊方法[转]
    转:extern "C"的用法解析
    转:3d max 2013 安装教程,凭着一种互联网精神提供给广大朋友
    转:Bullet物理引擎不完全指南(Bullet Physics Engine not complete Guide)
    转:折腾一晚上Bullet及Ogre相关工具的成果 -- 3Ds Max,Maya, blender, GameKit
    转:CMake快速入门教程-实战
  • 原文地址:https://www.cnblogs.com/gaox97329498/p/11914056.html
Copyright © 2011-2022 走看看