抖音系统设计
clarifying
- 成分分析: 视频分享平台, 主要关注上传, 下载, streaming和后台分布式系统
- 规模分析: 10亿用户, 分布在150个国家, 每天10亿浏览量, 一年100亿个视频
- 主要目标:
- time in app, 大概每人每天1小时
abs
- 主动出击, 缩短问题范围
- 主动出击, 提议重点关注
- 确保面试官同意你的想法, 或者说你们要在一个频道上
细节假设
- 视频大小: 时长, 分辨率等
- 视频数据考虑
- 数据量计算: * 视频量, 流量, 数据量, 冗余考虑
- (replica + device) * 10 => 很大很大
- 考虑支持这种数据量的存储格式, e.g. blob
- 元数据考虑
- 数据量考虑
- 存储方式, NoSQL
- 流量考虑
- 计算和统计流量大小
- 用户文件等…
abs
- 具体细分假设, 具体数字计算
- 全面考虑: 数据, 元数据, 网络流量, 用户数据, 存储方式
- 不断跟面试官确认方向ok
组件设计
- 负载均衡
- 微服务
- 用户基本预览功能的
- 上传的
- 直播的
- 数据库
- 视频数据
- 像之前考虑的, blob格式存储
- 可以直接考虑现成产品: amz S3等
- 分层存储: 时间分, 地区分等等
- 元数据
- NoSQL, 但要有结构, 因为有要经常查看
- 用户数据
- 考虑到用户间存储关系(SQL, 图谱), 可以考虑amz RDS, google spanner等
- 冷热数据分离
- 视频数据
- CDN以及区域影响的考虑
- CDN如CloudFront
- 用户体验设计(推荐系统)
- 推荐系统微服务
- 获取一个视频列用用于推荐给用户:
video_id[]
- 模块间交互的考虑, e.g. app server获取用户信息, 然后发送给推荐系统模块
- abs
- 善用工具, 画好图不言自明
- 冷热数据分离: 元数据, 视频数据
- 尝试把技术都用上做个app
- 微服务: 业务拆分
- S3做blob存储
- NoSQL做元数据存储
- SQL做用户数据的存储, 考虑建立用户之间的关联
- CloudFront做CDN
详细数据结构设计
- metadata设计
- 用户数据设计
- 用户画像
- …
- 视频数据设计
- 用户画像标签
- …
- 用户数据设计
abs
- top down: 先hight level的看
瓶颈考虑
- 分布式数据库
- tradeoff: 不是所有数据量都需要分布式的
- 离线计算: 利用手机GPU预处理
abs
- 考虑设备自身的计算功能