在你与Meta(原名Facebook)安排面试时,你会被问是否想要参加系统设计面试(简称“海盗”)或产品/ API设计面试(简称“海盗X”)。
在对Meta(以及微软和Educative)的数十名候选人进行了系统设计面试后,我看到了优缺点——以及成功背后的一些共同因素。今天,我将分享一份完整的系统设计成功指南,并分析9个常见的系统设计面试问题,一个申请Meta的软件开发工程师候选人可能会遇到。
让我们开始吧!
由于问题表述模糊,你将被期望提出进一步的问题以理解问题、界定其范围、并明确需求和可能的约束条件。
你将开始你的设计。在讨论了功能性和非功能性需求之后,你将选择主要组件及其在高层次设计中的相互作用。完成高层次设计后,你将定义数据的存储模式并定义API接口模型。
在此之后,你可以开始详细的设计阶段,在此过程中你将讨论每个组件并解决高层设计中的任何不足之处。这可能包括讨论数据结构、算法、通信协议以及实现细节。
为系统设计问题设计一个有效的解决方案是具有挑战性的,因为它涉及各种技能,包括网络基础知识、分布式系统、数据库、架构等。然而,面试官并不会对你掌握的技能或经验抱有过高的不切实际期望,对初级工程师的期望肯定低于对高级工程师的期望。
表现最优秀的候选人具有出色的交流能力.
系统设计面试高度依赖于讨论过程,因此你应该在讨论过程中清晰地表达你的思考过程。你将被要求回答后续问题,以讨论其他设计方面,评估已定义的需求并讨论其合理性,并强调独特功能。这些是向面试官展示你的深度知识并证明你具备该职位/级别所需的适当知识的机会。
说了这些,当你在评估并收到你最终设计的反馈时,你可以预期会有很多讨论。因此时间管理非常重要。你的面试大约持续45分钟,其中包括5分钟的开场介绍。你应该把最多30分钟用于设计过程,以便你有足够的时间进行最后的讨论。
Meta系统设计面试的过程
现在你已经知道了可以期待的内容,我们来讨论在 Meta 的系统设计面试中常见的问题。
对于下面的每个设计问题,我们将讨论其详细设计的起点,包括其功能性和非功能性需求和高层次设计。
问题陈述: 设计一个两人在线国际象棋游戏。它需要快速且可靠,并支持月活跃用户(MAU),,达到1亿,每人每周玩一局游戏。
我将遵循以下要求来构建棋盘游戏系统:
功能规范:
非功能需求:
国际象棋的高级设计包含API网关、负载均衡器和不同的服务。玩家可以通过游戏引擎在应用服务器中开始一场比赛。游戏引擎执行各种任务,包括棋步验证、游戏状态管理以及规则执行。同样,游戏引擎的管理器负责管理游戏引擎实例的生命周期,并在各个游戏引擎之间分配负载以优化资源利用,确保可扩展性。WebSocket服务器负责玩家之间的实时通信以及比赛过程中的走法广播。同样,在游戏过程中,所有状态会被实时记录到持久层。
西洋棋的架构设计
功能需求:
非功能性的需求
评论审核系统的高级设计包括用户认证服务、评论服务、评论审核服务和 AI/ML 引擎。还需要负载均衡器以在服务器之间均匀分配负载。评论服务使用发布-订阅模式将用户评论转发给评论审核服务。AI/ML 引擎的目的是审查和过滤评论。类似地,持久层存储用户的数据、评论和元数据。
问题陈述: 设计一个推荐系统,为数千万用户提供关于短视频的推荐。
以下是一些设计推荐系统的要求。
功能规范:
非功能需求:
推荐引擎的高层次设计包括负载均衡器、应用服务器、推荐服务、数据收集器、大数据处理系统、数据库和离线AI系统。推荐服务将用户的数据和偏好存储在数据库中;同时,它从AI系统获取推荐,并通过应用服务器将这些推荐反映到用户的屏幕上。数据收集器将数据导入大数据处理系统,在那里数据被分析并从中提取有用的见解。同样,经过处理的数据被输入离线AI系统,在那里离线训练预测模型,以增强用户推荐的性能和准确性。
推荐引擎的高层次设计
4) 设计 Dropbox 产品
问题说明: 设计一个可扩展且安全的系统,以使用户能够在不同设备之间存储、共享及访问文件,适用于Dropbox。
类似的问题包括 : 设计 Google Drive 和一个协作式文档编辑系统(谷歌文档)._
我将考虑以下针对 Dropbox 系统的要求:
功能需求:
非功能性需求
Dropbox的高级架构包括负载均衡器、应用服务器、块服务器、云存储、元数据服务器、消息队列和同步服务器。文件通过块服务器上传或从云存储下载。与每个用户和文件相关的元数据由元数据服务器处理,并存储在元数据存储中。同样,同步服务器负责在多个设备之间同步文件。这些服务会将对云存储中文件所做的更改或对元数据所做的任何更新通知用户。
Dropbox的架构设计
需求描述: 设计一个像 CamelCamelCamel (C3) 一样可扩展、可靠且高效的 价格跟踪器 系统。
我将考虑以下几点要求:
功能需求:
非功能需求
C3的高级设计主要由两个服务组成:搜索服务和产品服务。除了这两个服务之外,C3系统通过API网关连接到其他亚马逊服务,从而为潜在客户提供最新的数据。发布-订阅模式将这些服务解耦,并使它们之间能够进行通信。搜索服务支持客户的搜索查询,而产品服务则向用户推荐产品并通过发布-订阅模式向客户通知价格变化。
CamelCamelCamel的高层次设计
问题陈述: 设计一个可扩展和稳健的社交媒体平台,类似Instagram的,该平台允许用户分享照片和视频,关注其他用户,点赞或点踩帖子内容,并接收实时通知。
我将着重于以下需求:
功能需求:
非功能需求:
问题陈述: 设计一个高度可扩展性且高度安全的消息传递系统,像WhatsApp一样。
类似的问题: 设计Facebook Messenger应用。
我会考虑以下 WhatsApp 设计的要求:
功能需求
非功能性需求
问题陈述: 假设你能够访问数百万台计算机,。设计一个网络爬虫系统,可以下载所有这些计算机上的内容以不被检测的方式。
功能规范:
非功能性需求:
问题描述: 设计一个可扩展且具有容错能力的分布式缓存系统,通过快速访问频繁请求的数据来提高 web 应用程序的性能表现。
我将考虑以下几点来设计分布式缓存系统:
功能需求:
非功能需求:
深入了解该分布式缓存的详细设计方案。
系统设计面试是您作为软件工程师、技术领导或团队负责人职业发展中的一个关键环节。您在其中的表现可能意味着您能否获得梦寐以求的工作或被降级到较低的级别。
在 Educative,我们提供了多种不同的由行业专家、博士和前 FAANG 工程师撰写的 系统设计课程系列,您可以在这些课程中更好地理解系统设计的基础知识,并通过实际问题进行动手实践。请参见下方的相关课程: