第一步:需求场景分析
这里分为功能性需求和非功能性需求,都是非常重要的。
-
功能性需求
- 谁用,使用角色是谁,有哪些。
- 现在有什么问题,为什么要开发这个系统。
- 解决了他什么问题,达到什么目标。
- 有哪些场景,多描述
- 如果功能很多,建议分期来做,先做核心功能,后面再做其他功能,持续迭代
说白了就是该系统的价值、意义、使用场景,替谁解决了哪些问题。
-
非功能性需求
-
用户量评估,例如集团用户2w
-
并发用户以及峰值评估,例如最高并发用户100,峰值预估120
-
每天的总体QPS评估、很有意义,加Cache啊,存储选型的依据
-
读写比评估、很有意义,加Cache啊,存储选型的依据
-
存储评估,每年多少TB、GB的数据,存储多少年
-
带宽评估,上行、下行带宽
-
多久上线、工期,团队评估
-
浏览器、手机兼容性等
-
其他方面
- 高可用,排在第一位
- 扩展性,功能方面
- 安全性
- 可监控。。。
- 高性能,排在最后
-
可行性分析,以现有的团队,指定的工期能不能实现,让你造个火箭,有生之年估计都没戏
整个设计过程涉及的技术选型,这里记下每种中间件的限定值
- 一台Web Server承受量约为 1K的QPS
- 一台SQL Database承受量约为 1K的QPS
- Redis约为10W的QPS
- Nginx约为5W的QPS
第二步:系统API、服务设计
-
基于领域,划分几个服务
-
每个服务设计的API
-
设计API接口,一般都会有对资源的CRUD
第三步:存储设计
分析系统,涉及哪些类型的数据
结构化、半结构化、非结构化
- 数据库
- 选用关系数据库
- 选用非关系数据库
- 分析对象关系
- 建立对象关系模型
- 每个字段选用合适的类型
- 预估索引、是否联合索引、唯一索引等
- 是否是关系数据库或者非关系数据库以及是否并存。
- 分库分表
- 文件系统
- 缓存系统
第四步:高可用和高性能等
是否有核心瓶颈点算法优化
注意 权衡 Trade-off思想,没有万能钥匙
-
过期数据清理和规整
-
整体负载均衡
-
安全性
-
可监控
Cache:缓存,万金油,哪里不行优先考虑
Queue:消息队列,常见使用Linkedin的kafka
Asynchronized:批处理+异步,减少系统IO瓶颈
Load Balance: 负载均衡,可以使用一致性hash技术做到尽量少的数据迁移
Parallelization:并行计算,比如MapReduce
Replication:提高可靠性,如HDFS,基于位置感知的多块拷贝
Partition:数据库sharding,通过hash取摸
架构建议越简单越好,可以慢慢迭代。