我简单总结了一下系统设计面试相关问题的问法:
-
设计一个某某系统比如秒杀系统、微博系统、抢红包系统、短网址系统。
-
设计某某系统中的一个功能比如哔哩哔哩的点赞功能。
-
设计一个框架比如 RPC 框架、消息队列、缓存框架、分布式文件系统等等。
-
某某系统的技术选型比如缓存用
Redis
还是Memcached
、网关用Spring Cloud Gateway
还是Netflix Zuul2
。
我们将步骤总结成了以下 4 步。
Step1:问清楚系统具体要求
当面试官给出了系统设计题目之后,一定不要立即开始设计解决方案。 你需要先理解系统设计的需求:功能性需求和非功能性需求。
为了避免自己曲解题目所想要解决的问题,你可以先简要地给面试官说说自己的理解,
为啥要询问清楚系统的功能性需求也就是说系统包含哪些功能呢?
毕竟,如果面试官冷不丁地直接让你设计一个微博系统,你不可能把微博系统涵盖的功能比如推荐信息流、会员机制等一个一个都列举出来,然后再去设计吧!你需要筛选出系统所提供的核心功能(缩小边界范围)!
为啥要询问清楚系统的非功能性需求或者说约束条件比如系统需要达到多少QPS呢?
让你设计一个1w人用的微博系统和100w人用的微博系统能一样么?不同的约束系统对应的系统设计方案肯定是不一样的。
Step2:对系统进行抽象设计
我们需要在一个 High Level 的层面对系统进行设计。
你可以画出系统的抽象架构图,这个抽象架构图中包含了系统的一些组件以及这些组件之间的连接。
Step3:考虑系统目前需要优化的点
对系统进行抽象设计之后,你需要思考当前抽象的系统设计有哪些需要优化的点,比如说:
-
当前系统部署在一台机器够吗?是否需要部署在多台机器然后进行负载均衡呢?