系统设计(System design)面试方法论

1. 明确需求

系统设计通常是开放性的大问题,通常没有明确的唯一解法,所以需要明确需求,确定你没有理解错面试官的意思,系统设计面试通常只有35-40分钟来完成设计,所以我们需要专注那一部分的功能需要完成设计。这些确定的功能是后面设计的重点
以完成一个类似twitter(微博)的应用为例子,这里是部分问题去明确需求:

  • 用户可以发推特和关注其他用户吗?
  • 需要去设计一个用户的时间线来展示推文吗?
  • 推文是否只是文字,是否含图片和视频?
  • 用户是否能搜索推文?
  • 当关注的大V发推,关注用户是否会收到通知?

2. 定义接口

根据需要完成的功能去设计系统需要的APIs, 进一步明确需求确保你没理解错
以完成一个类似twitter(微博)的应用为例子,这部分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. 确定系统规模以及后续如何拓展

这也会有所帮助后续重点讨论的扩展、分区、负载平衡和缓存的选型

  • What scale is expected from the system (e.g., number of new tweets, number of tweet views, number of timeline generations per sec., etc.)?
  • How much storage will we need? We will have different numbers if users can have photos and videos in their tweets.
  • What network bandwidth usage are we expecting? This will be crucial in deciding how we will manage traffic and balance load between servers.

4. 设计数据结构

定义数据实体会明确数据是如何在系统不同功能模块之间流转的,它将指导进行数据分区和管理。候选人应该能够
识别系统的各种实体,它们将如何相互作用,以及的不同方面数据管理,如存储、运输、加密等。
这里是twitter的部分实体
User: UserID, Name, Email, DoB, CreationData, LastLogin, etc.
Tweet: TweetID, Content, TweetLocation, NumberOfLikes, TimeStamp, etc. UserFollowo: UserdID1, UserID2 FavoriteTweets: UserID, TweetID, TimeStamp
我们应该使用哪种数据库系统?像Cassandra这样的非关系型数据库是否最适合我们的需求,还是应该使用类似MySQL的解决方案?我们应该使用什么样的块存储来存储照片和视频?

5. 顶层设计

通过图示画出系统中的核心模块,表示我们系统的核心组件。我们应该确定从端到端解决实际问题所需的足够多的组件。对于Twitter,在高层,我们将需要多个应用程序服务器来提供所有的读/写服务前面有负载均衡器的流量分布请求。如果我们假设有更多的读取流量(与写入流量相比),我们可以决定使用单独的服务器来处理这些场景。在后端,我们需要一个高效的数据库,可以存储所有的推文,并且可以支持大量读取。我们还需要一个分布式文件存储系统来存储照片和视频。
[图片]

6.详细设计

对核心模块进行深挖,进行深入讨论。可能会有多种方案,我们需要对多种方案的优缺点进行权衡。
重点:没有唯一的答案,重点是比较不同方案的优缺点,根据系统限制条件选择

  • 数据量级越来越大,如何进行数据的存储?如何将数据分片存储到多台服务器上?
  • 大V热点问题如何解决?
  • 用户时间线数据查询优化(scan)
  • 缓存的使用

7. 系统瓶颈分析

讨论系统中可能的瓶颈,并讨论解决方案。

  • 是否存在单点问题,单点异常或失败了如何处理
  • 是否有足够的数据副本在部分服务器宕机的时候仍然能提供服务
  • 服务的性能监控、告警、降级
  • 41
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值