这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天
关系链业务
弱好友关系:不需要双方同意
一条弱关系的产生,会产生两条记录,例如:一条关注记录、一条粉丝记录
查询用户关注列表
在关注表的该用户uid上建立索引
查询用户粉丝列表
在粉丝表的该用户uid上建立索引
tips:相互关注确立好友关系
强好友关系:需要双方同意
- 联合主键,约定uid顺序;数据量较大时需要分库,使用uid1分库,在uid2上的查询需要遍历多库
- 弱好友关系实现;数据冗余
10亿级关系链
水平切分
数据冗余
服务同步冗余
步骤
- 业务方调用服务新增数据
- 服务插入T1
- 服务插入T2
- 服务返回
优点
- 简单
- 数据一致性较高,双写成功才返回
缺点
- 请求处理时间增加
- 数据肯不一致
服务异步冗余
服务层异步发出消息,通过消息总线发送给一个专门的数据复制服务来写入冗余数据
- 业务方调用服务,新增数据
- 服务先插入 T1 数据
- 服务向消息总线发送一个异步消息(发出即可,不用等返回,通常很快就能完成)
- 服务返回业务方新增数据成功
- 消息总线将消息投递给数据同步中心
- 数据同步中心插入 T2 数据
优点
- 请求处理时间短
缺点
- 系统复杂度高
- 存在数据不一致时间窗口
- 消息总线故障导致数据不一致
线下异步冗余
解除“数据冗余”对系统的耦合,由线下的服务来完成
- 业务方调用服务,新增数据
- 服务先插入 T1 数据
- 服务返回业务方新增数据成功
- 数据会被写入到数据库的 log 中
- 线下服务或者任务读取数据库的 log
- 线下服务或者任务插入 T2 数据
优点
- 数据双写与业务解耦
- 请求处理时间短
缺点
- 存在数据不一致时间窗口
- 数据一致性依赖线下服务或者任务的可靠性
最终一致性
最终一致性。并不是完全保证数据的实时一致,而是尽早的发现不一致,并修复不一致
线下扫描正反冗余表全部数据
优点
- 简单
- 线上服务无需修改,修复工具与线上服务解耦
缺点
- 扫描效率低
- 不一致时间窗口长
线下扫描增量数据
每次只扫描增量的日志
- 写入T1
- 写入日志log1
- 写入T2
- 写入log2
优点
- 简单
- 数据扫描效率高
缺点
- 需要修改线上服务
- 时效性不高,不一致窗口取决于扫描周期
实时线上“消息对”检测
- 写入正表 T1
- 第一步成功后,发送消息 msg1
- 写入反表 T2
- 第二步成功后,发送消息 msg2
优点
- 效率高
- 实时性高
缺点
- 复杂
- 线下多订阅总线的检测服务
参考文献: