概述
Scenario 场景:需要设计哪些功能,设计的质量性能等等需要有什么要求
Service 服务:大系统拆分成小系统
Storage 存储:数据如何存储,如何访问
Scale 升级:优化维护,解决缺陷,处理可能遇到的问题
常用术语
- Concurrent User 并发用户
- 日活跃*用户平均请求次数/一天多少秒=每秒请求数
- 请求峰值
- 增长量/变化的需求
- Read QPS(Queries Per Second)读频率
- Write QPS(Queries Per Second)写频率
Scenario 场景
需要考虑的方面
- 需要设计哪些功能
- 需要承受多大的访问量(DAU:日活跃用户 MAU:月活跃用户)
- 需求者的要求
实战:设计一个论坛
罗列功能
- 注册/登陆
- 用户信息展示/编辑
- 多媒体文件上传
- 搜索
- 发帖/转发
- 数据流(个人用户数据流/全局数据流)
- 关注/取消关注
侧重主体功能
- 注册/登陆
- 数据流(个人用户数据流/全局数据流)
- 发帖
- 关注/取消关注
QPS
- QPS=100 用一台的普通的电脑做服务器就可以了
- QPS=1k 需要一台好一点的服务器,并且需要考虑宕机的处理手段
- QPS=1m 需要建设一千台服务器集群,并且需要考虑某一个节点宕机的处理方法
- 一台服务器预估可以承受1kQPS(理想状况下,比如请求和处理比较轻量级,服务器性能比较好,否则会往往会小于1k,以下三点也是在理想情况下考虑)
- 一台SQL Database预估可以承受1kQPS
- Cassandra预估可以承受10kQPS
- Memcached预估可以承受1mQPS
Service 服务
1.大系统拆分成小系统
2.小系统归并成完整系统
Storage 存储
选择
关系型数据库:用户信息
非关系型数据库:推文、社交图谱
文件系统:图片、视频
缓存系统:高速访问,适合访问频率高的数据
Scale 升级
- 解决bug,设计缺陷
- 拓展功能
- 应对特殊情况
- 提高鲁棒性
- 提高拓展性,应对流量暴增
案例 新鲜事系统
举例
比如朋友圈,微博,QQ空间
场景
需要获取所有好友的动态里面时间最新的100条。
解决方法
方案1:主动拉取
当需要查看动态时,主动拉取所有好友的前100条动态,并做一次K路归并,获取最靠新的100条动态,展示。
缺点
需要现场算,没法直接取,所以速度比较慢
方案2:主动投递
当一条动态发布时,主动投递给所有好友,这样子获取动态时直接读数据即可,不要处理数据
缺点
需要花费额外空间存储投递信息,在发帖的时候需要进行n次投递(n为好友数量),不过可以用异步任务解决