##【fjj】备份思想
把本地的所有数据全量发到后端,后端存时间戳和备份,根据备份的时间选择是否覆盖。
问题
- A 修改了部分数据同步,另一设备 B 离线修改了之后再次联网,会覆盖掉 A 所做的修改。
- 全量同步耗费流量,我们带宽也来不起。
##【ghb】
后端正常存储所有的数据,每一个数据均存储一个时间戳,前端获取后台最新的时间戳,若比本地更新则拉取后端数据覆盖本地。
问题
- 全量同步耗费流量。
- A 修改了部分数据同步,另一设备 B 离线修改了之后再次联网,会在同步时被 A 所做的修改覆盖。
【milestone】git 思想
前端和后端均存储所有数据,前端同步时发送所有的数据 id 和时间戳,后台比对后返回给前端需要新增 / 更新的内容,并请求前端本地修改的内容,前端根据 id 查找这些内容后再次请求后端,后端修改内容。
问题
A 删除了部分内容,和后端同步时服务器不能分辨被删除的内容是 A 删除的还是另一终端 B 新增的。
【final】
在 milestone 的基础上进行修改。
前端和后端均存储所有数据,前端同步时发送所有的数据 id 和时间戳、以及本地删除的 id 表,后台比对后返回给前端需要新增 / 更新的内容,并请求前端本地修改的内容,前端根据 id查找这些内容后再次请求后端,后端修改内容。
问题
需要两次网络 IO。
【2019-05-24 的更新 1】
在 final 的基础上进行修改。
前端和后端均存储所有数据,同时前端维护一张新增 / 修改表 A 和删除表 B,当药品信息被修改后,在 A 中存储相关 id;当药品信息被删除后,在 B 中存储相关 id。同步时,前端先根据 A 中的 id 获得新增 / 修改的药品内容集合 Y,然后在请求中传递参数 Y 和 B,后端接收请求,根据 B 删除服务器上的相关内容,根据 A 新增 / 覆盖现有内容,返回需要前端本地数据进行修改的表 C 和需要删除的表 D,以及当前时间戳 T,前端收到响应后根据 C 分别更新内容,根据 D 删除内容,同时将 T 更新到表 A 的所有条目。
##【2019-05-24 的更新 2】
又联想到用户没有进行过同步时,没有时间戳,并且不能由客户端生成时间戳(因为手机时间是可以进行修改的),只能由服务器生成时间戳,于是继续修改。
客户端在第一次同步时获取时间戳,并在前端和后端均保存此时间戳为上次同步时间(单个字段)
last_update_timestamp
。前端和后端均存储所有数据,同时前端维护一张新增 / 修改表 A 和删除表 B,当药品信息被修改后,在 A 中存储相关 id;当药品信息被删除后,在 B 中存储相关 id。同步时,前端先根据 A 中的 id 获得新增 / 修改的药品内容集合 Y,然后在请求中传递参数 Y 和 B,以及上次同步时间 T1。
后端接收请求,分析请求的内容和服务器上的内容的冲突条目。根据 T1 和服务器当前的同步时间 T2,判断谁更新来解决冲突条目。若 T1 < T2,则服务器更新,冲突的内容选择服务器端的;若 T1 > T2,则客户端更新,冲突的内容选择请求中的。此外,根据 B 中不冲突的删除服务器上的相关内容,根据 A 中不冲突的内容新增内容。更新结束后服务器时间戳更新为当前时间 T3。
后端返回时,若 T1 < T2,则响应返回多的项目和已经删除的项目、以及当前时间戳 T3,前端收到响应后根据 C 分别更新内容,根据 D 删除内容,同时更新时间戳为 T3;若 T1 > T2,则只返回时间戳 T3。
问题
在服务器端如何判断一个项目是多的/删除的?
【final-final】
在 final 的基础上进行修改。
客户端在第一次同步时获取时间戳,并在前端将此时间戳刷新到每一药品条目上,然后将此数据发给后端进行第一次同步。
前端和后端均存储所有数据,前端同步时发送所有的数据 id 和相应时间戳、以及本地删除的 id表,后台比对后返回给前端需要新增 / 更新的内容,并请求前端本地修改的内容,前端根据 id 查找这些内容后再次请求后端,后端修改内容。
问题
- 需要两次网络 IO。