1.什么是系统设计?(System Design)
系统设计是一个定义系统架构、模块、接口和数据满足特定需求的过程。
比如设计一个短网址服务、评论服务、Feed流系统、抢红包系统。
微服务架构很多系统被按照业务拆分,需要单独设计一个系统服务。比如短网址服务一开始由于推特只能发140个字,然后很多时候贴一个很长网址就直接快把字符给沾满了,所以因为这个需求才诞生短网址服务,就是根据一个长度来生成一个短地址。现在很多网站如: 头条、微博、知乎都能见到类似形式的短网址。
在一个公司可能有很多不同部门不同的业务,不可能每个业务需要短网址服务就开发一套。这个时候就需要公司里提供一个供其它所有业务使用的一个短网址服务。
2.系统设计的难点
中高级工程师必经之路:
需要具有相关领域、算法的经验,有一定的架构设计能力。(Feed流推拉模型)
熟悉后端技术组件,比如消息队列、缓存、数据库、各种Web框架等,需要熟悉这些组件使用场景甚至底层原理。
具备文档撰写、流程图绘制、架构设计、编码实现等综合能力
3.系统设计怎么答?
① 很多新手碰到这种问题完全不知道怎么回答
完全没有思路的(很多毕业生对这种问题完全手足无措)
有一定思路,但是回答没有重点
能回答上来重点,但是思路不够清楚
② 系统设计的要素
系统设计三大要素:
使用场景和限制条件
数据存储设计
算法模块设计
③ 如何回答系统设计题目?
按照三个要素来回答:
问面试官:什么场景和条件下使用?(经常会遇到面试官上来就抛一句:如何设计一个短网址系统。问题虽然经典但其实他问的比较宽泛,就是你根本不知道在什么场景下什么条件下去使用,所以第一个要素就是需要搞清场景和使用条件)
设计数据存储系统
设计算法相关模块
④ 要素之一:场景和限制
什么场景使用?有哪些条件?
这个系统是在什么地方使用的?比如短网址系统提供给站内各种服务生成短网址
限制条件:用户估计有多少?至少要能支撑多少用户(服务)
估算并发 qps:峰值 qps 是多少?平均 qps 是多少?(qps就是每秒的查询请求量)
⑤要素二:数据存储设计
数据库的选型,选型数据库以及怎么来去设计存储:
按照设计数据表,需要哪些字段,使用什么类型?数据增长规模
数据库选型:是否需要持久化?使用关系型还是 NoSQL?
如何优化?如何设计索引?是否可以使用缓存?
⑥ 要素之三:算法模块设计
算法解决问题的核心。程序=算法+数据结构。系统=服务+存储。
需要哪些接口?接口如何设计
使用什么算法或者模型?
不同实现方式之间的优劣对比,如何取舍?比如有些方式是牺牲时间去换空间,有些可能牺牲空间换时间,这个时候就需要根据系统本身做权衡。
4.针对中高级工程师,可能会问一些深入的问题(如何扩展、容错)
用户多了,qps 高了如何处理?
数据存储多了不够存了如何处理?
故障如何处理?单点失败、多点失败、雪崩问题