查看: 9398| 回复: 7
跳转到指定楼层
上一主题 下一主题
收起左侧

[经验总结] 经典系统设计twitter(浅谈版)

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
用户可以follow其它用户。被follow的用户如果发贴,则要按照时序出现在foller的timeline里。很明显这是一个写频繁(考虑到帖子字数要求140以下),读更频繁的分布式系统。

考虑到很多的小的写操作,一开始我的思路是纯粹按照用户来sharding。但是看过参考资料才知道这是不可取的。因为会有两个因素导致冷热不均:水车型用户(大量的写和存储)以及网红型用户(大量的读操作)

否决掉这个后,自然想到的就是按照unique id来sharding。

unique id的构成由
  • userid前缀
  • 发帖时间戳,

组成。不特别把所有某个用户的帖子全部集中于一个sharding。可能是存储于连续的若干shardings里。

我这个版本,不同于参考资料的,有几个好处:
  • 写操作可以分布到用户区间涵盖该用户的服务器上,插入。
  • 浏览他人的tweets,往往要倒序查阅所有的该用户的帖子。那么因为我这个unique id是以用户id为前缀的。所以可以很快获取所有的该用户的帖子。
  • 帖子和用户的关系也就不必再写入关系型数据库了。查找某个用户的帖子可以query(比如:用户id+周一,用户id周三)。


cache可以用来存储高频阅读的帖子,比如网红贴。

对于timeline的生成,
当用户发帖的时候,unique id就会生成,那么一方面写入存储媒体,一方面把帖子的id写入follow我的用户的timeline中。
我认为应该区分网红(follower超过某个数)和非网红。非网红的可以使用fan-out-on-write。而网红的贴采用fan-out-on-read。在用户读取的时候做aggregation处理。

retweet也是帖子。只不过其中的body是个ref-id的chain。比如A retweet B, but B was retweeting from C, C was retweeting from D. 这样读完这个ref-id的chain后可以deduce出ABCD的用户名,另外只要去取帖子D的内容就可以了。

estimation没有做,明白了以上的设计,加上一些常数和估计数字,estimation应该没有问题。

评分

参与人数 7大米 +34 收起 理由
zhangrz2 + 1 很有用的信息!
tank_z + 1 给你点个赞!
edwardhy1990 + 3 很有用的信息!
szzxmf + 3 很有用的信息!
chan9118 + 3 很有用的信息!

查看全部评分


上一篇:设计logging OOD
下一篇:分布式🔒
全局:
然而事实上分网红完全没必要。纯pull模型现在企业级的云完全handle得过来,反而维护两套业务逻辑代码,并且还要设置网红margin是很头疼的事情。还不如不干。
回复

使用道具 举报

推荐
 楼主| 14417335 2019-3-28 21:15:37 | 只看该作者
全局:
alibi 发表于 2019-3-28 10:43
userid + ts 的组合还是会shard到同一个partition上去吧? 怎么保证一个单独的key(userid+ts)会分布到某些sh ...

楼顶我的叙述是「不特别把所有某个用户的帖子全部集中于一个sharding。可能是存储于连续的若干shardings里。」
这样userid + ts 的组合会shard到连续的shardings里。但是每个单独的key(userid+ts)只会到某一个shard上。这样就把大小不同用户的数据分散了。而避免了冷热问题。

回复

使用道具 举报

全局:
好想法,受教了
回复

使用道具 举报

🔗
admin 2019-3-16 10:42:43 | 只看该作者
全局:
本文被选为03/15/2019全站置顶文章之一。
作者获得大米奖励,谢谢你的分享

也欢迎大家分享你收集和研究的系统设计题目、一起讨论
回复

使用道具 举报

🔗
alibi 2019-3-28 10:43:35 | 只看该作者
全局:
userid + ts 的组合还是会shard到同一个partition上去吧? 怎么保证一个单独的key(userid+ts)会分布到某些shard上,之后查询的时候不至于遍历所有的shard
回复

使用道具 举报

全局:
假设follow 100个用户,这样db设计 我刷新timeline会很慢吧。
twitter读还是应该比写多,个别用户再狂写,大多数粉丝在狂读。
提速读肯定要用到cache server,问题就是cache什么,如何cache,如何update cache。
回复

使用道具 举报

🔗
 楼主| 14417335 2019-3-28 21:30:42 | 只看该作者
全局:
Neil_Acton 发表于 2019-3-28 21:07
假设follow 100个用户,这样db设计 我刷新timeline会很慢吧。
twitter读还是应该比写多,个别用户再狂写, ...


你提出这点“twitter读还是应该比写多,个别用户再狂写,大多数粉丝在狂读。“很有道理。


为了增速,除了楼顶提到的“cache可以用来存储高频阅读的帖子,比如网红贴。“,那么cache也应该用于最近的tweets。
在cache里,如果按照tweetID来shard,同时设置某个时间延迟的expiration,比如一般的用户的tweet统计后得知大多数是1天后就读的少了,那么设置延迟为2天。是不是就可以了?


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表