十大经典系统架构设计面试题
翻译自:https://medium.com/geekculture/top-10-system-design-interview-questions-10f7b5ea123d
在我作为微软和 Facebook 的高级软件工程师和面试官的 10 年时间里,我曾与数百名应聘者一起工作,帮助他们解决不同的系统设计问题。
开发人员往往会在 SDI 问题上挣扎,因为它们是开放式的,通常需要一种批判性思维,而在其他编码面试挑战中没有实践过。
虽然 SDI 问题会随着时间的推移而变化,但有些问题在各大顶级公司的面试中仍然很受欢迎。
今天,我们将探讨 10 个最常见的系统设计面试问题,你必须在每个问题中解决的常见问题,以及一些帮助你做到这一点的工具。
以下是我们今天要讲的内容::
回答任何问题的技巧
设计一个聊天服务
设计拼车服务
设计一个 URL 缩短服务
设计一个社交媒体服务
设计一个社交留言板
设计文件存储服务
设计一个视频流媒体服务
设计一个 API 速率限制器
设计一个邻近服务器
设计一个预输入服务
接下来该学什么?
任何 SDI 问题的提示
通过陈述你所知道的来开始每个问题:列出系统所需的所有特征,你期望在这类系统中遇到的常见问题,以及你期望系统处理的流量。列出清单的过程可以让面试官看到你的计划技巧,并在你开始解决问题之前纠正任何可能的误解。
叙述任何权衡:每个系统设计选择都很重要。在每个决定点,列出至少一个积极和消极的选择的影响。
让面试官澄清:大多数系统设计的问题都是有意模糊的。提出澄清问题,向面试官展示你是如何看待这个问题的,以及你对系统需求的了解。
讨论新兴技术:总结每个问题,概述系统如何以及在哪里可以从机器学习中受益。这将表明你不仅为当前的解决方案做好了准备,而且也为未来的解决方案做好了准备。
1. 设计一个像 Facebook Messenger 或 WhatsApp 这样的全球聊天服务
对于这个问题,您将设计一种允许用户在互联网上相互聊天的服务。对话可以是一对一的,也可以是与多个成员的群聊。信息应该只被包含在对话中的人访问。
所需的功能
信息必须通过互联网发送和接收。
服务必须支持一对一和群聊。
消息应该保存以备以后查看。
用户应该能够发送图片、视频以及文本信息。
信息在传输过程中应该加密。
消息应该以最小的延迟可见。
常见问题
如果一条信息在没有网络连接的情况下发送会发生什么?当连接恢复时发送吗?
如何加密和解密消息而不增加延迟?
用户如何接收通知?
消息是从设备中提取(服务器周期性地提示设备,如果他们正在等待发送消息)或推送到服务器(设备提示服务器,它有一个消息发送)?
要考虑的工具
将数据库模式拆分为多个表:用户表(包含用户 ID 和联系人),聊天表(包含聊天 ID 和参与的用户 ID 列表)和消息表(包含对聊天 ID 的引用的过去消息)。
使用 WebSocket 实现设备和服务器之间的双向连接。
使用推送通知来通知会员,即使他们离线。
2.设计一个像 Uber 或 Lyft 那样的拼车服务
这个问题要求您创建一个拼车服务,将用户与附近的司机匹配起来。用户可以输入目的地并传输当前位置,并在几秒钟内通知附近的司机。然后,应用程序跟踪司机和用户当前位置之间的路径,然后从用户的位置到目的地。
所需的功能
系统必须跟踪所有用户和驱动程序的当前位置。
用户和司机必须在途中收到最新的旅行信息。
必须在流程的各个点上支持数千个用户,并相应地进行扩展。
驱动程序和用户必须持续连接到服务器。
常见问题
如何在繁忙时期保持低延迟?
驱动程序是如何与用户配对的?迭代所有驱动程序来寻找欧几里得距离是低效的。
如果驱动程序或用户失去连接会发生什么?
如何存储所有缓存的位置数据?
要考虑的工具
使用 S2Geometry 库将位置分割为单元格。仅计算与用户在同一 cell 内的司机距离。
使用分布式存储存储所有用户的位置,每个用户的位置数据大约只有 1Kb。
如果位置数据停止,设备继续报告他们之前的位置,同时等待重新连接。
在提示最近的司机开车后,设置缓冲。如果他们拒绝,就去找下一个司机。
3.设计一个 URL 缩短服务,如 TinyURL 或 bit.ly
这个问题要求你创建一个程序来缩短像 TinyURL 或 bit.ly 这样的长 url。这些程序接受一个长 URL 并生成一个新的、唯一的短 URL。它们还可以接受缩短的 URL 并返回原始的完整 URL。
所需的功能
返回一个比原始 URL 短的 URL
必须存储原始 URL
新生成的 URL 必须能够链接到存储的原始
缩短的 URL 应该允许重定向
必须支持自定义短 url
必须同时支持多个请求
常见问题
如果两个用户输入相同的自定义 URL 怎么办?
如果用户比预期的多怎么办?
数据库如何管理存储空间?
工具来考虑
使用散列来链接原始和新的 url
使用 REST API 来负载均衡高流量和处理前端客户端通信
使用多线程同时处理多个请求
使用 NoSQL 数据库存储原始 url(存储的 url 之间没有关系)
设计一个像 Facebook、Twitter 或 Instagram 这样的大众社交媒体服务
对于这个问题,你要设计一个社交媒体服务,我的 10 万用户都在使用它,比如 Instagram。用户应该能够查看被关注用户的帖子的新闻提要,并建议用户可能喜欢的新内容。面试官通常希望听到你更深入地讨论新闻推送。
所需的功能
强大的新闻推送和推荐系统
用户可以发布公告
其他用户可以对帖子进行评论或点赞
必须能够同时满足多个用户的需求
系统必须是高可用的
常见问题
知名用户将拥有数百万粉丝,与普通用户相比,他们是如何处理的?
系统如何按年龄加权帖子?老帖子比新帖子更不容易被浏览。
关注读和写节点的比例是多少?是否可能有更多的读请求(用户查看帖子)或写请求(用户创建帖子)?
如何提高可用性?系统如何更新?如果一个节点失败了会发生什么?
您如何有效地存储帖子和图像?
工具来考虑
使用滚动更新和复制节点来最大化可用性。
使用训练有素的机器学习算法推荐帖子。
创建一个数据库模式,分别存储名人和用户。
使用社交图来进一步追踪你的习惯
5. 设计一个像 Quora, Reddit 或 HackerNews 这样的社交网络和留言板服务
对于这个问题,您将设计一个类似论坛的系统,用户可以在其中发布问题和链接。其他用户可以查看并评论这些问题。问题有表示其主题的标签,用户可以通过标签查看特定主题的问题。用户有一个新闻提要,从他们跟随的标签和相关主题中突出热门问题。
所需的功能
用户必须能够创建公共帖子和应用标签
文章必须按标签排序
其他用户必须能够实时发表评论。
数据库必须存储每个帖子的数据(视图,赞等)
新闻提要必须显示文章从跟随的标签和文章从其他标签,用户会喜欢。
必须支持高流量的观众和新帖子。
常见问题
我们的产品只需要在网络上工作吗?
用户上传的图片/链接存储在哪里?
系统如何确定相关标签?有多少未跟随标签的文章显示在提要中?
帖子如何在服务器网络中分布?
工具来考虑
使用 SQL 数据库来映射关系数据(用户有帖子,帖子有评论/喜欢,类别有相关帖子,等等)
使用多线程和负载平衡层来帮助支持更高的流量。
使用分片来分解系统。考虑按类别分片,将相同标签的帖子存储在一台机器上。
使用机器学习和自然语言处理来寻找标签之间的关系
6.设计一个全球性的文件存储和共享服务,如 Dropbox,谷歌驱动器,或谷歌照片
对于这个问题,您将创建一个同步的、跨平台的存储系统,如 Dropbox。用户可以存储文件和照片,并从其他设备访问它们。
所需的功能
用户应该能够通过 web 保存/删除/更新/共享文件
旧版本的文档应该保存以回滚
文件更新应该跨多个设备同步
常见问题
文件存储在哪里?
你如何处理更新?你重新上传整个文件了吗?
小的更新需要一个完整的文件更新吗?
系统如何处理两个用户同时更新一个文档?
工具来考虑
使用分块法将文件分割成多个部分。更新只重新上传部分而不是整个文件。
使用像 Amazon S3 这样的云存储来处理内部数据库。
让客户端不断与服务器检查,以确保并发更新应用。
7. 设计一个像 YouTube 或 Netflix 这样的全球视频流媒体服务
这个问题要求你创建一个像 YouTube 这样的在线视频流媒体服务。该服务将存储和传输数百拍字节的视频数据。它还必须存储统计数据(视图、喜欢、视图数量等),并允许用户发表评论。您的解决方案必须是可伸缩的,以支持数以千计的并发用户。
所需的功能
视频应该可以在网上上传
用户应该在互联网上接收到不间断的流
每个视频都应该存储和访问视频统计信息。
评论必须保存,并与视频显示给其他评论
应该支持数千用户的高流量
常见问题
你的服务如何确保在不同质量的互联网上流畅的视频流?
您的服务如何响应流速度的突然下降(缓冲、质量下降等)?
视频是如何存储的?
工具来考虑
使用云技术存储和传输视频数据。
使用机器学习建议新的视频内容。
防止不一致的连接出现结巴和延迟。用户查看的是几分钟前的数据,而不是传入的数据
8. 为 Firebase or Github
对于这个问题,您将创建一个 API 速率限制器,用于限制服务在给定时间段内可以接收的 API 调用数量,以避免过载。面试官可以在不同的范围内提出这个问题,从一台机器到整个分布式网络。
所需的功能
设备每小时限制 10 个请求
限制器必须通知用户,如果他们的请求被阻止。
必须处理适合其规模的规模。
常见问题
您的系统如何度量每小时的请求?如果一个用户在 1 点 20 分发出 10 个请求,然后在 2 点 10 分又发出 10 个请求,那么他们在相同的 1 小时窗口内发出了 20 个请求,尽管时间改变了。
分布式系统与本地系统的设计有何不同?
工具来考虑
使用滑动时间窗口,以避免每小时重置。
保存一个计数器整数而不是请求本身,以节省空间。
9. 设计一个类似 Yelp 或附近的地方/朋友的邻近服务器
对于最后一个问题,您将设计一个近距离服务器,用于存储和报告到餐馆等地方的距离。用户可以根据距离或受欢迎程度搜索附近的地点。该数据库必须存储全球 5 亿个地方的数据,但具有低延迟。
所需的功能
拥有多达 5 亿家门店。
地点必须唯一标识,并有相应的数据,如质量审查和服务时间。
搜索必须以最小的延迟返回结果。
用户必须能够根据距离或质量搜索结果。
常见问题
如何存储这么多位置数据?
如何实现快速搜索结果?
你的系统如何处理不同的人口密度?严格的纬度/经度网格将根据密度产生不同的响应性。
我们如何优化常见的搜索位置?
工具来考虑
使用关系数据库来存储位置列表和相关数据。
使用缓存来存储最流行的位置的数据。
使用分片(sharding)按区域分割数据。
在一个特定的动态网格中搜索位置。如果单个单元中有超过 500 个位置,则将网格分割成 4 个更小的单元。重复这个过程,直到你只需要搜索不到 500 个地点。
10. 设计一个与搜索引擎相关的服务,如提前输入
该服务将部分完成搜索查询,并显示 5 个建议来完成查询。它应该实时适应高度搜索的内容,并向其他用户提供建议。例如,“海鹰队赢得了超级碗”会在事件发生的几分钟内被提示。
所需的功能
服务应该将部分查询与流行查询进行匹配。
纠正小的拼写错误,如“dgo→dog”
应该根据查询猜测 5 个最有可能的选项
当查询被写入时,结果应该更新
常见问题
你纠正拼写错误的力度有多大?
如何更新选择而不造成延迟?
如何确定最有可能完成的查询?它能适应用户的搜索吗?
如果用户快速输入会发生什么?建议是否只在它们完成后才出现?
工具来考虑
使用自然语言处理机器学习算法来预测下一个字符。
使用马尔可夫链对热门查询的概率进行排序。
每小时或每天更新 ML 算法,而不是实时更新,以减少负担。
接下来该学什么
这些问题可以帮助你理解在系统设计面试中你需要解决的问题类型。练习解决和解释这样的问题是你为下一次面试做准备的最有效的方法。学习快乐!
评论