System Design vol.1
最近在看 << grokking the system design interview >> ,一个专门为system design 面试写的教程,书中对面试中常见的场景,按照既定的模板进行了分析与解答,同时还给出了常见后端架构的知识点。
1. Step 1: Requirements clarifications 澄清需求
由于都是开放式问题,没有唯一的答案,所以在面试前期确定问题的范围,并澄清需求歧义的部分很重要。另外,面试中我们只有35-40min 来设计庞大的系统,所以需要搞清楚在整个系统设计中,哪些是我们需要专注的部分。
以设计一个类似Twitter的服务为例,在进入面试下一阶段前, 你需要弄清楚以下问题:
1. 用户是否可以发推,关注其他用户
2. 是否需要创建并展示用户的时间线
3. 推文是否需要包含视频、图片
4. 是否只需关注后端部分,还是也需要开发前端部分
5. 用户能否搜索推文
6. 是否需要展示热门趋势话题
7. 是否需要为热门/重要的推文推送通知消息
2. Step 2: System interface definition 定义系统接口
设计系统需要的API,保证我们的理解的需求是正确的。例如
postTweet(user_id, tweet_data, tweet_location, user_location, timestamp, …)
generateTimeline(user_id, current_time, user_location, …)
markTweetFavorite(user_id, tweet_id, timestamp, …)
3. Step 3: Back-of-the-envelope estimation 规模预估
为了后续的扩容、对数据进行分区、负载均衡、缓存数据,我们需要对系统的各方面进行预估。
- 系统的规模(用户数、Tweets 总数、浏览量,等等)
- 需要多少存储(是否包含图片和视频可能会使存储量大大不同)
- 流量(QPS 等决定了你需要多大的带宽,以及对后端存储的压力,如何进行负载均衡,等等)
4. Step 4: Defining data model 定义数据模型
数据需要在不同系统内的流转,如何设计一个好的 data model 至关重要,因为关系着后续数据的管理和分区。再细节一点,如何选择数据库,用 NoSQL 还是关系型数据库?如何是关系型,又该如何设计 schema?
5. Step 5: High-level design 高级设计 (架构图)
从前到后,画出系统的必要组件。对于 Twitter,我们需要不同的服务器来处理各种读写请求,再往下,我们需要数据库和缓存来保证数据能被快速写入和读取。如果需要存储图片和视频,我们还需要额外的 file system 甚至 CDN。
6. Step 6: Detailed design 设计细节
选择其中一两个系统进行详细分析和设计。对于这样的详细设计,一般都会有不同的方案,我们需要列出其中的优劣之处,并进行取舍。
- 数据如何进行 sharding?
- 如何处理热门的用户和数据?
- 为了 timeline 要不要专门为了拉取最新的数据进行优化?
- 在哪一层加缓存?
7. Step 7: Identifying and resolving bottlenecks 识别瓶颈
尝试找出系统的瓶颈或单点。
- 怎么解决单点问题?
- 数据是否有冗余,避免丢失。
- 服务器节点的高可用怎么做?
- 如何监控程序的指标?
参考
grokking the system design interview
https://liamchzh.com/tech/2019/03/02/about-system-design-1/
Comments
Post a Comment