关注分表 | 青训营笔记

65 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天

关系链业务

弱好友关系:不需要双方同意

一条弱关系的产生,会产生两条记录,例如:一条关注记录、一条粉丝记录

查询用户关注列表

在关注表的该用户uid上建立索引

查询用户粉丝列表

在粉丝表的该用户uid上建立索引

tips:相互关注确立好友关系

强好友关系:需要双方同意

  1. 联合主键,约定uid顺序;数据量较大时需要分库,使用uid1分库,在uid2上的查询需要遍历多库
  2. 弱好友关系实现;数据冗余

10亿级关系链

水平切分

数据冗余

服务同步冗余

步骤

  • 业务方调用服务新增数据
  • 服务插入T1
  • 服务插入T2
  • 服务返回

优点

  • 简单
  • 数据一致性较高,双写成功才返回

缺点

  • 请求处理时间增加
  • 数据肯不一致

服务异步冗余

服务层异步发出消息,通过消息总线发送给一个专门的数据复制服务来写入冗余数据

  • 业务方调用服务,新增数据
  • 服务先插入 T1 数据
  • 服务向消息总线发送一个异步消息(发出即可,不用等返回,通常很快就能完成)
  • 服务返回业务方新增数据成功
  • 消息总线将消息投递给数据同步中心
  • 数据同步中心插入 T2 数据

优点

  • 请求处理时间短

缺点

  • 系统复杂度高
  • 存在数据不一致时间窗口
  • 消息总线故障导致数据不一致

线下异步冗余

解除“数据冗余”对系统的耦合,由线下的服务来完成

  • 业务方调用服务,新增数据
  • 服务先插入 T1 数据
  • 服务返回业务方新增数据成功
  • 数据会被写入到数据库的 log 中
  • 线下服务或者任务读取数据库的 log
  • 线下服务或者任务插入 T2 数据

优点

  • 数据双写与业务解耦
  • 请求处理时间短

缺点

  • 存在数据不一致时间窗口
  • 数据一致性依赖线下服务或者任务的可靠性

最终一致性

最终一致性。并不是完全保证数据的实时一致,而是尽早的发现不一致,并修复不一致

线下扫描正反冗余表全部数据

优点

  • 简单
  • 线上服务无需修改,修复工具与线上服务解耦

缺点

  • 扫描效率低
  • 不一致时间窗口长

线下扫描增量数据

每次只扫描增量的日志

  • 写入T1
  • 写入日志log1
  • 写入T2
  • 写入log2

优点

  • 简单
  • 数据扫描效率高

缺点

  • 需要修改线上服务
  • 时效性不高,不一致窗口取决于扫描周期

实时线上“消息对”检测

  • 写入正表 T1
  • 第一步成功后,发送消息 msg1
  • 写入反表 T2
  • 第二步成功后,发送消息 msg2

优点

  • 效率高
  • 实时性高

缺点

  • 复杂
  • 线下多订阅总线的检测服务

参考文献: