场景

clientA不定时地把本地数据同步到server上,然后还有一个clientB(app)从server把数据同步下来,汇总展示

clientA数据结构

原始的数据(来自clientA)。每条都有create_time和modify_time,用于表示这条记录的创建时间和改动时间。同一时候系统里还有latest_backup_time字段,用来表示上次备份的时间。client每次备份。都会以这3个字段作为条件,找出须要备份的数据,上传到server

服务端数据结构

因为历史遗留问题,服务端收到备份数据之后,没有做其它的处理。而是直接写入数据库

clientB同步逻辑

clientB有latest_sync_time字段,用于表示最后一次从server同步的时间。这个字段是每次同步之后,服务端确定并返回的。client把这个时间戳记下来。

请求同步时,再带上这个时间戳。

然后服务端就以create_time。modify_time,latest_sync_time这3个字段作为条件,找出须要下发的数据,返回clientB

查询哪些数据须要下发的逻辑是:

这个方法的关键是。怎样确定latest_sync_time。因为create_time和modify_time都是clientA的本地时间。服务端也没有字段表示服务端入库的时间,所以服务端返回latest_sync_time到clientB的时候,不能用server接收到同步请求的时间,而要用本次查询到的数据中。最后的create_time或modify_time

其它方案

上面这个方法主要在确定latest_sync_time的时候比較麻烦。根源在于服务端入库的时候,没有把入库的服务端时间保存下来。假设在服务端有sync_time,那么比較起来就非常easy,仅仅要找到sync_time在latest_sync_time和now之间的数据就能够了。这些数据就是从上次同步到当前时刻的新数据,然后仅仅要把当前的时间,放在响应里一起返回client。client刷新latest_sync_time即可了

另外,上面这个方法把推断insert和update的逻辑也放在了服务端。

事实上服务端也能够把满足的数据直接发回clientB,然后在client推断id是否存在。就能够确定该数据是新增的。还是须要update的

这个方法感觉会更简单。并且因为sync_time是由服务端控制的,也能够避免因为clientA修改本地系统时间引起的逻辑错误。应该是一个更优的方案。

可是因为如今server里已经存在没有记录sync_time的历史数据。迁移起来比較麻烦,并且这样的方案也须要修改server现有的备份逻辑,所以最后还是决定採用第一种方案。新开发的系统,建议採用另外一种方案

一种client同步server数据的方案的更多相关文章

  1. Android简单的聊天室开发(client与server沟通)

    请尊重他人的劳动成果.转载请注明出处:Android开发之简单的聊天室(client与server进行通信) 1. 预备知识:Tcp/IP协议与Socket TCP/IP 是Transmission ...

  2. 分布式数据库数据从属与client与server的数据同步

    老实说,眼下市面上很多产品,的确是不成熟的产品. 用过一些,给人蛋痛的感觉. 导言 分布还是集总 今天我们来探讨一个非常重要的问题. 每一个程序猿都有其思想,我的思想之中的一个,就是分布式. 分布式, ...

  3. Docker-compose搭建ELK环境并同步MS SQL Server数据

    前言 本文作为学习记录,供大家参考:一次使用阿里云(Aliyun)1核2G centos7.5 云主机搭建Docker下的ELK环境,并导入MS SQL Server的商品数据以供Kibana展示的配 ...

  4. Oracle GoldenGate (以下简称ogg)在异种移植os同一种db之间的数据同步。

    Oracle GoldenGate (以下简称ogg)在异种移植os同一种db之间的数据同步. ogg要实现的功能: 同步可以细化到单个表,满足特定的where条件rows同步,称号column同步. ...

  5. SQL Server 复制 - 发布订阅(SQL Server 数据同步)

    原文:SQL Server 复制 - 发布订阅(SQL Server 数据同步) SQL Server的同步是通过SQL Server自带的复制工具来实现的,分发布和订阅2大步. A,复制-发布 发布 ...

  6. 几种Android数据序列化方案

    一.引言 数据的序列化在Android开发中占据着重要的地位,无论是在进程间通信.本地数据存储又或者是网络数据传输都离不开序列化的支持.而针对不同场景选择合适的序列化方案对于应用的性能有着极大的影响. ...

  7. jvm的运行模式 client和 server两种

    jvm的运行模式 client和 server两种 学习了:https://www.cnblogs.com/fsjohnhuang/p/4270505.html 在jdk 9的情况下,好像没有clie ...

  8. SQL Server数据全同步及价值分析[终结版]

    SQL Server数据全同步[终结版] 版权全部.转载请注明出处.谢谢! 经过两天的同步编写和測试.出了第一个Release版本号: 1. 本函数仅支持单向同步.即从一个主数据库想多个从数据库同步 ...

  9. SQL Server数据同步交换

    一.为了解决数据同步汇聚,数据分发,数据转换,数据维护等需求,TreeSoft将复杂的网状的同步链路变成了星型数据链路.     TreeSoft作为中间传输载体负责连接各种数据源,为各种异构数据库之 ...

随机推荐

  1. Visual studio 新建网站出现序号(x)

    参考链接: http://www.zhongdaiqi.com/vs2012-new-website-name-bug/ 现象: 分析: VS新建网站出现(1) 这个问题很神秘,把网站删除掉,再创建, ...

  2. Python (Page Object实例)

    Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,通过对界面元素和功能模块的封装减少冗余代码,同时在后期维护中,若元素定位或功能模块发生变化,只需要调整页面元素或功能模 ...

  3. 优化代码,引发了早期缺陷导致新bug

    早期系统有个缺陷,调用js时少提交一个参数,导致该参数一直是undefined,但是不会引起bug. 对系统进行优化后,这个参数变成了必要的,然后代码一直会走else,undefined值明显不是一个 ...

  4. POJ 2403 Hay Points

    Hay Points Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5735   Accepted: 3695 Descri ...

  5. [luoguP3317] [SDOI2014]重建(矩阵树定理)

    传送门 为了搞这个题又是学行列式,又是学基尔霍夫矩阵. 矩阵树定理 本题题解 无耻地直接发链接,反正我也是抄的题解.. #include <cstdio> #include <cma ...

  6. 刷题总结——魔法森林(bzoj3669)

    题目: Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同 ...

  7. 刷题总结——分糖果(bzoj2330)

    题目: Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖 ...

  8. 启动uwsgi报错error while loading shared libraries: libpcre.so.1:

    启动uwsgi时候报错: [root@ richie]# /usr/bin/uwsgi --ini /usr/local/nginx/conf/uwsgi.ini /usr/bin/uwsgi: er ...

  9. 常州模拟赛d3t3 两只怪物心心相印

    题目背景 从前我是一位无名的旅人,旅途中我得到了某样东西:贤者之石.我因此得到悠久的时光和漂泊的生命.1897年冬天,我一时兴起舍弃了旅人的生活. 贤者之石创造出来的,是货真价实的黄金.我的名声传遍了 ...

  10. ubuntu问题解答集锦

    一.su root提示认证失败 su root提示认证失败 ubuntu root是默认禁用了,不答应用root登陆,所以先要设置root密码.   执行:sudo passwd root 接着输入密 ...