10大系统设计面试题

如何设计大规模分布式系统已经成为软件工程师面试的标配。工程师们在系统设计面试中表现吃力,主要有两个原因:一、缺少开发大规模系统的经验;二、系统设计面试非机构化,开放性的特点,通常问题都没有标准答案。

在系统设计面试中表现出色将给你带来高回报,因为它能反映你处理复杂系统的能力,并能转化成面试公司为你提供的高级职位和高薪水。

本文列举了10大系统设计面试题,在这些面试题中,应该如何回答,跟面试官讨论的关键点应该在哪里。

源文: Top 10 System Design Interview Questions for Software Engineers (Fahim ul Haq)

1、设计一个短地址服务

给定一个典型的长地址(URL),如何设计服务生成一个短地址并保证它的唯一

做如下讨论:

  • 如何为每个URL生成一个唯一的ID?
  • 如何大规模地生成唯一的ID(每秒都有成千上万的URL短地址请求)?
  • 如何处理重定向?
  • 如何支持自定义短网址?
  • 如何删除过期的URL等?
  • 如何跟踪点击统计?

2、设计面向全球用户的视频流媒体服务

一想到视频,意味着你的服务将储存和传输PB级的数据。 你要讨论的是如何有效的存储和分发数据,以便大量用户同时观看和分享视频。

此外,还要讨论:

  • 如何记录视频的统计数据?如视频总浏览量,投票量等
  • 如何给视频添加实时的评论(如弹幕)

3、设计面向全球用户的聊天服务

该服务面试官想知道的是:

  • 如何设计用户间的一对一的聊天?
  • 如何扩展你的设计来支持群聊?
  • 当用户断网如何处理?
  • 什么时候发送推送消息?
  • 你能否提供端到端的加密?如何做?

4、设计社交网络,留言板服务

用户可以发布问题或分享链接。其他用户可以回答问题或对共享链接发表评论。

  • 记录每个回答的统计数据,例如总浏览量、投票数等
  • 用户可以关注其他用户或主题
  • 时间线将由所有用户的最新问题和他们关注的话题组成(类似于信息流生成)

5、设计面向全球用户的文件存储和分享服务

讨论点:

  • 用户如何上传/查看/搜索/共享文件或照片
  • 如何跟踪文件共享的传输情况
  • 如何允许多个用户编辑同一个文档

6、服务上亿用户的社交媒体服务

当设计一个拥有数亿(或数十亿)用户的社交媒体服务时,面试官很想知道你会如何设计以下组件:

  • 高效存储和搜索帖子或微博
  • 信息流的生成
  • 社交图谱(谁与谁成为好友或谁关注谁--特别是当数百万用户关注一个名人的时候
  • 很多时候,面试官会用整个面试的时间来讨论信息流的设计

7、设计一个共享打车服务

在设计共享打车服务的时候,要讨论以下内容

  • 最核心的业务场景--当用户请求乘车时,如何有效地将他们与附近的司机匹配
  • 如何为总是在移动的司机和乘车人存储数百万个地理位置
  • 如何处理司机/骑手位置的更新(每秒更新数百万次)

8、设计搜索引擎相关服务

对于Type-Ahead,当用户输入查询时,你需要设计一个服务,它将根据用户输入的关键字推荐前10个搜索词。讨论的内容包括:

  • 如何存储以前的搜索查询
  • 如何保持返回的数据总是新的
  • 如何为已经输入的字符串找到最佳匹配
  • 如何处理更新和用户输入太快的情况

对于网络爬虫来说,我们必须设计一个可扩展的服务,它可以抓取整个Web,并且可以获取数以亿计的Web文档。讨论的内容包括:

  • 如何找到新的网页
  • 如何对动态变化的网页进行优先级排序
  • 如何确保你的爬虫不会无限地停留在同一个域名上

9、设计一个API速率限制器

开发一个速率限制器服务

  • 限制一个实体在一个时间窗口内可以向一个API发送的请求数量,例如,每秒15个请求
  • 速率限制应该适用于分布式设置,因为API是通过服务器集群访问的
  • 你将如何处理流量调节

10、设计一个查找附近的人或地点的服务

这项服务将需要为数百万人/地点存储位置。讨论的内容包括

  • 该服务的用户如何能够搜索附近的朋友或地点
  • 如何对地方进行排名(根据距离、用户评价)
  • 如何根据人口密度有效地存储位置数据(例如,纽约市的一个街区可能比一个小城市的人都多)

(全文完)