一种客户端同步server数据的方案

场景

客户端A不定时地把本地数据同步到server上,然后另一个客户端B(app)从server把数据同步下来,汇总展示

客户端A数据结构

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

服务端数据结构

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

客户端B同步逻辑

客户端B有latest_sync_time字段,用于表示最后一次从server同步的时间。这个字段是每次同步之后,服务端确定并返回的,客户端把这个时间戳记下来。请求同步时,再带上这个时间戳。然后服务端就以create_time,modify_time,latest_sync_time这3个字段作为条件,找出需要下发的数据,返回客户端B

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

这个方案的关键是,如何确定latest_sync_time。由于create_time和modify_time都是客户端A的本地时间,服务端也没有字段表示服务端入库的时间,所以服务端返回latest_sync_time到客户端B的时候,不能用服务器接收到同步请求的时间,而要用本次查询到的数据中,最后的create_time或modify_time

其他方案

上面这个方案主要在确定latest_sync_time的时候比较麻烦。根源在于服务端入库的时候,没有把入库的服务端时间保存下来。如果在服务端有sync_time,那么比较起来就很容易,只要找到sync_time在latest_sync_time和now之间的数据就可以了。这些数据就是从上次同步到当前时刻的新数据,然后只要把当前的时间,放在响应里一起返回客户端,客户端刷新latest_sync_time就行了

另外,上面这个方案把判断insert和update的逻辑也放在了服务端。其实服务端也可以把满足的数据直接发回客户端B,然后在客户端判断id是否存在,就可以确定该数据是新增的,还是需要update的

这个方案感觉会更简单,而且由于sync_time是由服务端控制的,也可以避免由于客户端A修改本地系统时间引起的逻辑错误,应该是一个更优的方案。但是由于现在server里已经存在没有记录sync_time的历史数据,迁移起来比较麻烦,而且这种方案也需要改动server现有的备份逻辑,所以最后还是决定采用第一种方案。新开发的系统,建议采用第二种方案

一种客户端同步server数据的方案

时间: 2024-10-29 02:48:05

一种客户端同步server数据的方案的相关文章

SQL Server 数据归档方案

目的 本文旨在从数据库管理方面,提供将SQL Server大数据表归档的解决方案.可以作为新业务上线时进行方案设计的参考. 归档方案选型 方案一: 方案介绍 BCP导出数据到本地目录目录后,遍历目录文件BCP导入到临时表,再循环删除源表数据.通过Insert into - Left Join -通过主键关联临时表和归档表排除存在的数据.(或通过2008及后续版本的Merge语句,不存在插入,存在更新) 方案优缺点 优点:BCP性能好.通过SP容易控制逻辑.维护简单 缺点:逻辑略繁琐 方案二: 方

sql server数据同步方案-日志传送

1 功能描述 本方案采用日志传送模式,把核心数据库(主数据库)定期同步到灾备数据库(辅助服务器)及备份库(辅助服务器,便于其他系统使用,减轻主数据压力),期间,如果发生异常导致无法同步,将以电子邮件.短信方式通知管理人员. 2 系统环境 2.1硬件 主数据库: SQLHA 灾备库服务器:DisaterDBSVRA 备份库服务器:BackupDataSVR 2.2软件 主数据库: Win2008 x64 SQL2005 SP4 x64 灾备库: Win2008 x64 SQL2005 SP4 x6

几种Android数据序列化方案

一.引言 数据的序列化在Android开发中占据着重要的地位,无论是在进程间通信.本地数据存储又或者是网络数据传输都离不开序列化的支持.而针对不同场景选择合适的序列化方案对于应用的性能有着极大的影响. 从广义上讲,数据序列化就是将数据结构或者是对象转换成我们可以存储或者传输的数据格式的一个过程,在序列化的过程中,数据结构或者对象将其状态信息写入到临时或者持久性的存储区中,而在对应的反序列化过程中,则可以说是生成的数据被还原成数据结构或对象的过程. 这样来说,数据序列化相当于是将我们原先的对象序列

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

SQL Server数据全同步[终结版] 版权全部.转载请注明出处.谢谢! 经过两天的同步编写和測试.出了第一个Release版本号: 1. 本函数仅支持单向同步.即从一个主数据库想多个从数据库同步 2.主数据库的不论什么增删改都会同步到全部从数据库上 3. 最重要的一点:同步数据库的价值所在:当主数据库server不可用时,程序能够使用其它从数据库或者备用数据库,这对于未来公有云和私有云应用具有重大价值! 代码: <span style="font-size:18px;">

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

原文:SQL Server 复制 - 发布订阅(SQL Server 数据同步) SQL Server的同步是通过SQL Server自带的复制工具来实现的,分发布和订阅2大步. A,复制-发布 发布之前,需要设置好几个前置条件,发布属性和快照位置.发布主要是设置发布数据库,如未设置,所有的发布,订阅可正常进行,也可通过快照同步,但是却无法在后面的修改中实时同步. 其次,设置快照位置.快照位置设置是在“分发服务器属性”中的发布服务器设置.如果设置的位置不能被订阅机访问,订阅是最好采用发布机推送订

Android客户端和服务器端数据交互的第二种方法

网上有很多例子来演示Android客户端和服务器端数据如何实现交互不过这些例子大多比较繁杂,对于初学者来说这是不利的,现在介绍几种代码简单.逻辑清晰的交互例子,本篇博客介绍第二种: 一.服务器端: 代码1:添加名为"AndroidServerServlet.java"的文件 package com.ghj.packageofservlet; import java.io.IOException; import java.io.PrintWriter; import javax.serv

Android客户端和服务器端数据交互的第三种方法

网上有很多例子来演示Android客户端和服务器端数据如何实现交互不过这些例子大多比较繁杂,对于初学者来说这是不利的,现在介绍几种代码简单.逻辑清晰的交互例子,本篇博客介绍第三种: 一.服务器端: 代码1:添加名为"AndroidServerServlet.java"的文件 package com.ghj.packageofservlet; import java.io.IOException; import java.io.PrintWriter; import javax.serv

Android客户端和服务器端数据交互的第四种方法

网上有很多例子来演示Android客户端和服务器端数据如何实现交互不过这些例子大多比较繁杂,对于初学者来说这是不利的,现在介绍几种代码简单.逻辑清晰的交互例子,本篇博客介绍第四种: 一.服务器端: 代码1:添加名为"AndroidServerServlet.java"的文件 package com.ghj.packageofservlet; import java.io.IOException; import java.io.PrintWriter; import javax.serv

Oracle DBLink跨数据库访问SQL server数据同步 踩坑实录

项目需求:这里暂且叫A公司吧,A公司有一套人事管理软件,需要与我们公司的软件做人员信息同步,A公司用的是SQL server数据库,我们公司用的Oracle,接口都不会开发(一万句"fuck you"),就单单给我们公司提供了一个SQL server的账户和密码,还有一个视图.后来百度一番,可以通过DBLink跨数据库访问,然后做数据信息同步功能. 安装过程中,踩了不少的坑,需要配置很多的东西,QQ群里也请教不少人,都很少人听说还有这玩意,现在做数据对接,都是走到接口,传JSON字符串