寝室关于多端同步的一次思考

##【fjj】备份思想

把本地的所有数据全量发到后端,后端存时间戳和备份,根据备份的时间选择是否覆盖。

问题

  1. A 修改了部分数据同步,另一设备 B 离线修改了之后再次联网,会覆盖掉 A 所做的修改。
  2. 全量同步耗费流量,我们带宽也来不起。

##【ghb】

后端正常存储所有的数据,每一个数据均存储一个时间戳,前端获取后台最新的时间戳,若比本地更新则拉取后端数据覆盖本地。

问题

  1. 全量同步耗费流量。
  2. 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 查找这些内容后再次请求后端,后端修改内容。

问题

  1. 需要两次网络 IO。

参考

  1. how-to-make-mobile-app-work-offline
  2. How to Sync Your Data Across Multiple Devices