写点什么

微信朋友圈高性能架构设计

作者:地下地上
  • 2022 年 5 月 29 日
  • 本文字数:1004 字

    阅读完需:约 3 分钟

动态设计

方案选择

朋友圈动态是一个读多写少的操作,可以采取两种方案

读扩散

读扩散也称为“拉模式”,这应该是最符合我们认知直觉的一种技术实现方式。

每一个内容发布者都有一个自己的发件箱(“我发布的内容”),每当我们发出一个新帖子,都存入自己的发件箱中。当我们的粉丝来阅读时,系统首先需要拿到粉丝关注的所有人,然后遍历所有发布者的发件箱,取出他们所发布的帖子,然后依据发布时间排序,展示给阅读者。

这种模式:

  • 1)好处是:底层存储简单,没有空间浪费;

  • 2)坏处是:每次读操作会非常重,操作非常多。

设想一下:如果我关注的人数非常多,遍历一遍我所关注的所有人,并且再聚合一下,这个系统开销会非常大,时延上可能达到无法忍受的地步。

写扩散

系统中每个用户除了有发件箱,也会有自己的收件箱。当发布者发表一篇帖子的时候,除了往自己发件箱记录一下之外,还会遍历发布者的所有粉丝,往这些粉丝的收件箱也投放一份相同内容。这样阅读者来读 Feed 流时,直接从自己的收件箱读取即可。

这种设计:每次发表帖子,都会扩散为 M 次写操作(M 等于自己的粉丝数),因此成为写扩散。每篇帖子都会主动推送到所有粉丝的收件箱,因此也得名推模式。

这种模式可想而知:发一篇帖子,背后会涉及到很多次的写操作。通常为了发帖人的用户体验,当发布的帖子写到自己发件箱时,就可以返回发布成功。后台另外起一个异步任务,不慌不忙地往粉丝收件箱投递帖子即可。

写扩散的好处在于通过数据冗余(一篇帖子会被存储 M 份副本),提升了阅读者的用户体验。通常适当的数据冗余不是什么问题


模式选择

写扩散适用于好友量不大的情况,比如微信朋友圈正是写扩散模式。每一名微信用户的好友上限为 5000 人,也就是说你发一条朋友圈最多也就扩散到 5000 次写操作,如果异步任务性能好一些,完全没有问题


动态高性能设计


动态高性能方案



评论/点赞设计

至于点赞和评论的实现,是相对简单的。上面说了微信后台有一个专门的表存储评论和赞的数据,比如 Kate 是 Mary 和小王的朋友的话,刷到了 K2 这一条发布,就会同时从评论表里面拉取对应 K2 的、Mary 留下的评论内容,插入到 K2 内容的下方。而如果另一个人不是 Mary 和小王的共同朋友,则不会看到这条评论。

选用图数据库,而不用关系型数据库。理由是:图数据库以实体和关系为基本单位,特别适合查询和分析多层次、多样的复杂关系;关系数据库则在复杂关系查询方面不堪重负,尤其是涉及多表关联或者递归查询时。

评论/点赞高性能设计


评论/点赞高性能方案



用户头像

地下地上

关注

还未添加个人签名 2019.05.06 加入

还未添加个人简介

评论

发布
暂无评论
微信朋友圈高性能架构设计_架构实战营_地下地上_InfoQ写作社区