信息流聚合类系统(如RSS阅读器)中数据同步的架构设计
目录
需求
- 要求支持用户能够用一个账号在多台设备上同步数据(这要求同步状态存储在服务器上)
- 凡是需要在服务器存储用户状态数据的,需要评估存储容量的限制
- 要求用户标记为已阅的信息下次刷新不会再从服务器重复刷新
- 要求能够支持书签(或网盘类应用)的双向同步问题
基于时间戳的设计
主要思想:
- 将信息拆分为基本的item单位,以每个用户可自定义的最小时间间隔作为桶
- 每个桶里的item要么全部读完,否则下次还会重复更新下来
- 优点:不需要额外的存储,但是每次会有计算开销
- 要点:保证各个桶是整个数据集的disjoint的子集的union
基于每个用户消息队列的设计
- 每个信息源里的item有按照时间顺序的唯一id编号,不要使用数据库生成id,使用领域自然id或对象hash id
- 信息流的聚合相当于多队列聚合为一个队列,考虑某些支持消息序列持久化的中间件?
- 优点:稳定可靠
- 缺点:每个用户的聚合队列可能是一笔不小的存储开销
- 要点:
书签(或网盘类应用)的双向同步问题
- 在这类使用场景下,用户可用多个设备上传item(信息最小单位),(每个设备可视为一个信息源)
- 同时多台设备可获得一致的视图(或者叫“最终一致”)
- 同样,服务器端需要给这些item生成id以便引用,不要使用数据库生成id
- 如果客户端视图需要某种用户自定义的UI排序,不要把它作为一个整体XML文件进行更新;
- 引入“版本号”的概念,每次本地更新的上传均需要递增版本号,使用update_if_prev_version_match,许多Nosql类数据库均有这个设计
原文地址:https://www.jb51.cc/javaschema/284183.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。