如何设计 Twitter 时间线和搜索?
1.业务场景
业务场景如下:
- 用户发布推文
- 服务将推文推送给关注者,发送推送通知和电子邮件
- 用户查看用户时间线(来自用户的活动)
- 用户查看主页时间线(用户关注的人的活动)
- 用户搜索关键字
- 服务具有高可用性
其他场景:
- 服务将推文推送到 Twitter Firehose 和其他流
- 服务根据用户的可见性设置删除推文
- 如果用户没有关注被回复的人,则隐藏回复
- 尊重“隐藏转发”设置
- 分析
2.业务要求
假设如下:
- 流量分布不均
- 发布推文应该很快
- 向所有关注者发送推文应该很快,除非你有数百万关注者
- 1亿活跃用户
- 每天 5 亿条推文或每月 150 亿条推文
- 每条推文平均扇出 10 次交付
- 每天通过扇出发送 50 亿条推文
- 每月通过扇出发送 1500 亿条推文
- 每月 2500 亿次读取请求
- 每月 100 亿次搜索
时间线
- 查看时间线应该很快
- Twitter 阅读量大于写入量
- 优化推文的快速阅读
- 摄取推文写得很重
搜索
- 搜索应该很快
- 搜索是重读
简单的对业务要求进行计算,转换成业务指标
- 每条推文的大小:
tweet_id
- 8 个字节user_id
- 32 字节text
- 140 字节media
- 平均 10 KB- 总计:~10 KB
- 每月 150 TB 的新推文内容
- 每条推文 10 KB * 每天 5 亿条推文 * 每月 30 天
- 3 年内 5.4 PB 的新推文内容
- 每秒 10 万个读取请求
- 每月 2500 亿次读取请求 *(每秒 400 次请求 / 每月 10 亿次请求)
- 每秒 6,000 条推文
- 每月