系统设计这部分,无论广度还是深度,内容都太特么多了,每个点钻下去都是一片海。这玩意是面试高级职位必考的一个环节,甚至还面好几轮,我这里不定期整理一点,为下次跳槽打基础。

系统设计,通常以很简单的一句话开篇,然后主动权交到你手上,比如:

  • 如何设计一个微博 ?

  • 如何设计一个微信 ?

可以从以下几个角度思考,找自己擅长的方面说。

  1. 数据库角度,有哪些表,大概长啥样,用户量有多少,是否需要考虑分库或分表?由此可以引入数据库中间件相关的一堆问题。
  2. 服务角度,服务如何划分,有哪些 web service ,服务如何调用等?由此可以深入服务中间件等一堆服务发现注册治理相关问题。
  3. api 角度,大概读写 api 有哪些 ,接口名长啥样,主要看 restful api 对外是否简洁明了。
  4. 性能,吞吐量,延迟等方面,你会怎么做?考虑缓存,分布式缓存,以及消息中间件相关。
  5. 分布式架构下相关组件的一些问题,对 cap 理论的理解?
  6. 整体角度,DNS,CDN,负载均衡等等,谈谈对整个流程的理解。

上面每个点都可以谈论很久,并不是都要说出来,这里有个技巧,从较高的层次往下讲 (api -> components (database, web server) -> input / output),不断跟面试官沟通,确定他想考察这个流程链中的哪个区域,标出一些假设和约束,然后谈谈自己对这块的理解。

系统设计这块弹性很大,往往会决定工资的上限。