在软件工程面试过程中,系统设计轮已成为面试的标准部分。如果你想在一些大型科技巨头公司得到你梦寐以求的工作(尤其是作为一名高级工程师),那么你需要告诉你关于构建一个复杂的大型可扩展系统的方法。设计面试问题没有标准或准确的答案。
您可能会与不同的面试官进行不同的对话。由于缺乏构建大规模系统的经验和系统设计的开放性,很多候选人都在这一轮中挣扎。不仅初级和中级开发人员,而且经验丰富的开发人员在系统设计回合中都会感到不舒服。如果您正在为这一轮做准备,那么我们建议您阅读博客如何在面试中破解系统设计回合?。
我们将讨论一些大型科技公司面试官经常问到的一些常见的设计面试问题。我们还将讨论您在设计系统和向面试官解释答案时应该考虑的一些关键点。
1. 设计一个 URL 缩短服务 (TinyURL)
URL 缩短服务允许用户输入一个长 URL,然后它返回一个较短的、唯一的 URL。例如 bit.ly 和 TinyURL。如果用户提供一个长 URL,这些服务会生成一个短 URL,如果用户提供一个短 URL,那么它会返回原始的长 URL。
需要讨论和分析的事情:
- 给定一个长 URL,服务应该为其生成一个更短且唯一的别名。
- 当用户点击一个短链接时,服务应该重定向到原始链接。
- 如果每秒有 1000 个 URL 缩短请求,请考虑可扩展性。
- 服务句柄重定向。
- 支持自定义短 URL。
- 跟踪点击统计。
- 删除过期的 URL。
- 系统应该是高可用的。
在设计此服务时,您需要考虑三件事。
- API(REST API)-讨论客户端将如何遵循一种方法与服务以及作为服务前端的负载均衡器进行通信。
- 应用层——讨论工作线程或主机如何获取长 URL、生成小 URL 以及如何将这两个 URL 存储在数据库中。
- 持久层——数据库
2. 设计 YouTube/Netflix(全球视频流服务)
设计一个像 Youtube/Netflix 这样的视频流服务,用户可以在其中上传/查看/搜索视频。该服务应该是可扩展的,以便大量用户可以同时观看和共享视频。我吨将被存储和发送数PB和PB数据。
需要讨论和分析的事情:
- 记录有关视频的统计数据的方法,例如总观看次数、赞成票/反对票等。
- 实时添加对视频的评论。
组件:
- OC –像 AWS、OpenConnect 这样的云充当内容交付网络。
- 后端 –数据库
- 客户端– 使用 Youtube/Netflix 的任何设备
3. 设计 Facebook Messenger 或 WhatsApp(全球聊天服务)
需要讨论和分析的事情:
- 用户之间一对一短信的方法。
- 扩展设计以支持群聊的方法。
- 已送达和阅读状态
- 如果用户没有连接到互联网,需要采取什么行动。
- 推送通知
- 发送图像或其他文件等媒体
- 提供端到端消息加密的方法。
4.设计Quora/Reddit/HackerNews(社交网络+留言板服务)
这些服务允许用户发布问题、共享链接和回答其他用户的问题。用户还可以对问题或共享链接发表评论。
需要讨论和分析的事情:
- 记录每个答案的统计数据的方法,例如观看次数、赞成票/反对票等。
- 应该有关注选项供用户关注其他用户或主题。
- 新闻提要生成,这意味着用户可以在时间轴上查看所有用户和他们关注的主题的热门问题列表。
5. 设计搜索预先输入
Typeahead 服务允许用户输入一些查询,并基于它建议从用户输入的任何内容开始的热门搜索项目。
需要讨论和分析的事情:
- 存储先前搜索查询的方法
- 系统实时性要求
- 保持数据新鲜的方法。
- 找到与已输入字符串最佳匹配的方法
- 系统每秒处理的查询数。
- 选择建议的标准。
- 要存储的数据总数。
- 找到与已输入字符串最佳匹配的方法
6. 设计 Dropbox/Google Drive/Google Photos(全球文件存储和共享服务)
设计一个文件或图像托管服务,允许用户在其服务器上上传、存储、共享、删除和下载文件或图像,并提供跨各种设备的同步。
需要讨论和分析的事情:
- 从任何设备上传/查看/搜索/共享/下载文件或照片的方法。
- 服务应该支持设备之间的自动同步,即在一台设备上更新文件后,它应该在所有设备上同步。
- 系统中应该存在 ACID(原子性、一致性、隔离性和持久性)属性。
- 跟踪文件共享权限的方法。
- 允许多个用户编辑同一文档。
- 系统应支持存储高达 GB 的大文件。
7.设计一个网络爬虫
设计一个 Web Crawler可扩展服务,从整个 Web收集信息(爬取)并获取数亿个 Web 文档。
需要讨论和分析的事情:
- 寻找新网页的方法。
- 优先考虑动态变化的网页的方法。
- 确保爬虫不在同一个域上无界。
8. 设计 Facebook、Twitter 或 Instagram
你需要设计一个社会介质■ervice数十亿用户。大多数面试官都会花时间讨论这些应用程序中的新闻源生成服务。
需要考虑的功能:
- 要支持的某些特定 Twitter/Facebook/Instagram 功能。
- 每条推文或帖子的隐私控制。
- 用户应该能够发布推文,并且系统应该支持通过对话回复推文/分组推文。
- 用户应该能够看到趋势推文/帖子。
- 直接消息
- 提及/标记。
- 用户应该能够关注另一个用户。
需要分析的东西:
- 系统应该能够处理数十亿用户的巨大流量。
- 追随者数量
- 推文被收藏的次数。
组件:
- 新闻提要生成。
- 社交图(用户之间的朋友连接网络或谁关注谁? – ?特别是当数百万用户关注名人时)
- 高效存储和搜索帖子或推文。
9. 设计 Uber 或 lyft(拼车服务)
设计一项服务,让用户从应用程序请求乘车,然后司机到达目的地将他们带到目的地。系统设计轮面试中的一个常见面试问题。
架构:单体/微服务(实时服务、前端(应用)和数据库)
需要分析和讨论的事项:
- 后端主要服务于手机流量。 uber 应用程序通过移动数据与后端通信。
- 调度系统如何工作( GPS/位置数据是什么驱动调度系统)?如何高效地将用户请求与附近的司机进行匹配?
- 地图和路线如何在优步中工作? ETA 是如何计算的?
- 一种为总是在旅途中的司机/乘客存储数百万个地理位置的有效方法。
- 处理数百万个驱动程序位置更新的方法。
- Dispatch 主要使用Node.js构建
- 服务:主要用Python编写的业务逻辑服务。
- 数据库:Postgres、Redis、MySQL。
10. 设计一个 API 速率限制器(Github)
设计一个服务或工具来监控服务同意允许的每个窗口时间的请求数。如果请求数量超过速率限制器,则阻止所有多余的调用。
需要分析和讨论的事项:
- 限制实体可以在一个时间窗口内发送到 API 的请求数量,例如每秒 20 个请求。
- 速率限制应该适用于分布式设置,因为 API 可通过一组服务器使用。
- 如何处理节流(软节流和硬节流等)。