系统设计过程
把所有需要的东西聚集在一起,审视问题。不停的提问,以至于我们可以明确使用场景和约束。讨论假设。(这也就是需求分析其中的一步)
用户数量
- 根据用户数量所谓依据之一推断QPS,TPS
- 再着根据TPS,QPS对机器的选型
- 也是对业务架构的设计的依据之一,是否需要限流等。
使用方式
- 他们会怎样使用它?是通过移动端还是通过web页面呢?还是通过APP,或者小程序呢?
- 以及用户的使用APP的习惯,
用户使用人群
- 选择正确的UI界面。大概率的符合用户的审美。
系统的作用
- 根据系统的作用,选择合适的架构方式。现如今有的如,简单的业务逻辑如就简单的增删改查选择MVC架构,复杂的业务逻辑且有很多拓展需求的使用DDD架构等。
- 还有就是根据业务的作用选择合适的数据库。如一个文档系统那就选择mongoDB,如你的系统有大量的增删改查,那就得用一个拥有事务的数据库MYSQL+ innoDB引擎
- 在这就是根据系统的作用设计我们的业务流程图,和业务架构图,以及表设计。使用面向对象分析(OOA),面向对象设计(OOD) ,面向对象编程(OOP)
系统安全
- 先根据用户的使用人群来判断是否需要进行环境隔离。比如是否对系统进行
- 网关的设计,根据流量的大小以及内部系统的保护对网管进行设计。
- 负载均衡的设计,机器集群的负载均衡策略,集群心跳检查等,防止机器挂掉导致服务偶尔不可用
业务设计
- 业务流程图
http://www.woshipm.com/pd/675174.html - 系统架构图
- UML图
- 领域对象的划分
- 抽象业务为对象和类
- 将业务流程进行层级划分和接口设计
程序的开发。
系统的扩展性
- 负载均衡
- 水平扩展
- 缓存
- 数据库分片
总结
- 我对系统设计目前能想到的东西的描述
- 很多同学包括我有时候对于面试官给你一个需求让你去设计给去曲解了。
- 面试管并不是希望你立马给出一个方案。而是想看到到你的思考过程。包括给你说一个系统故障让你去排查。
参考
https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E4%B8%BB%E9%A2%98%E7%9A%84%E7%B4%A2%E5%BC%95