4S分析法
场景 - Scenario
是什么?
-
需要设计哪些功能
-
这一设计需要多牛(扛得住多少并发、支持多少用户、可用程度能达到什么标准等)
了解经验值
-
日活跃用户(DAU,Daily Active User)
-
月活跃用户(MAU,Monthly Active User)
-
读/写频率(QPS,Queries Per Second)
-
并发用户(秒) = 日活跃用户 * 每个用户平均每日请求次数(估算)/ 86400 秒
-
访问峰值 = 并发用户 * 倍数(通常 2~9 倍都是合理的)
-
通过上述数值做出对读/写 QPS 的估算
设计系统规模
-
QPS < 100:使用单机低配服务器就可以了
-
QPS < 1K:稍好一些的中高配服务器(需要考虑单点故障、雪崩问题等)
-
QPS 达到 1M:百台以上 Web 服务器集群(需要考虑容错与恢复问题,某一台机器挂了怎么办,如何恢复)
QPS 和 Web Server 或者 数据库的关系
-
一台 Web Server 的承受量约为 1K QPS
-
一台 SQL Database 的承受量约为 1K QPS(如果数据库访问中涵盖大量的 JOIN 和索引相关查询,这一数值会更小)
-
一台 NoSQL Database(如 Cassandra)承受量约为 10K QPS
-
一台 NoSQL 缓存 Database(如 Memcached 内存 KV 数据库)承受量约为 1M QPS
服务 - Service
将大系统拆分为小服务
-
Replay:重新过一下所有需求,为每个需求添加一个或多个服务
-
Merge:将相同的服务进行归并
存储 - Storage
什么数据?用什么存?怎么存?
-
Select:为每个服务选择合适的存储结构
-
Schema:细化数据库的表结构
常用数据库
-
SQL 数据库 - 关系型数据库:一般用于存储结构化数据,例如用户信息(Profile)、各种业务表单数据等
-
NoSQL 数据库 - 非关系型数据库:一般用于存储非结构化数据,文章、社交图谱等
-
文件系统:严格来讲,文件系统其实不属于数据库,但是在系统设计中,作为一种对数据进行存放、读写的容器,也是常常会出现在系统设计的相关问题中的。文件系统可以存放图片(非常推荐小图片可以用 fastDFS 这类分布式存储)、视频。AWS 的 S3 也属于一种文件系统
扩展 - Scale
该如何对系统进行优化和维护
优化(Optimize)
-
解决设计缺陷
-
更多功能设计
-
特殊用例的设计(极端情况、边界处理)
维护(Maintainance)
-
系统的鲁棒性:如果有一台/几台服务器/数据库挂了,怎么办?
-
系统的扩展性:如果流量暴增如何扩展系统?