为了账号安全,请及时绑定邮箱和手机立即绑定

我在 Meta 进行了系统设计面试会。以下是如何准备的。

在你与Meta(原名Facebook)安排面试时,你会被问是否想要参加系统设计面试(简称“海盗”)或产品/ API设计面试(简称“海盗X”)。

作为一名系统工程师,我选择了系统设计面试这一项。既然你在这里看这篇文章,我想你也是这么选择的。

在对Meta(以及微软和Educative)的数十名候选人进行了系统设计面试后,我看到了优缺点——以及成功背后的一些共同因素。今天,我将分享一份完整的系统设计成功指南,并分析9个常见的系统设计面试问题,一个申请Meta的软件开发工程师候选人可能会遇到。

让我们开始吧!

在 Meta(Meta 公司)的系统设计面试环节中会发生什么

在一些介绍之后,系统设计面试随即进入设计问题环节。问题将涵盖广泛的内容,要求你设计一个大规模的分布式系统,适用于某个应用程序或软件系统(例如,设计优步)。

由于问题表述模糊,你将被期望提出进一步的问题以理解问题、界定其范围、并明确需求和可能的约束条件。

你将开始你的设计。在讨论了功能性和非功能性需求之后,你将选择主要组件及其在高层次设计中的相互作用。完成高层次设计后,你将定义数据的存储模式并定义API接口模型。

在此之后,你可以开始详细的设计阶段,在此过程中你将讨论每个组件并解决高层设计中的任何不足之处。这可能包括讨论数据结构、算法、通信协议以及实现细节。

为系统设计问题设计一个有效的解决方案是具有挑战性的,因为它涉及各种技能,包括网络基础知识、分布式系统、数据库、架构等。然而,面试官并不会对你掌握的技能或经验抱有过高的不切实际期望,对初级工程师的期望肯定低于对高级工程师的期望。

表现最优秀的候选人具有出色的交流能力.

系统设计面试高度依赖于讨论过程,因此你应该在讨论过程中清晰地表达你的思考过程。你将被要求回答后续问题,以讨论其他设计方面,评估已定义的需求并讨论其合理性,并强调独特功能。这些是向面试官展示你的深度知识并证明你具备该职位/级别所需的适当知识的机会。

说了这些,当你在评估并收到你最终设计的反馈时,你可以预期会有很多讨论。因此时间管理非常重要。你的面试大约持续45分钟,其中包括5分钟的开场介绍。你应该把最多30分钟用于设计过程,以便你有足够的时间进行最后的讨论。

Meta系统设计面试的过程

参阅[ FAANG/MAAANG 系统设计面试初级指南 _](https://www.educative.io/blog/faang-system-design-interview-guide) 博客,更多关于系统设计面试的详细信息可以在该博客中找到。

现在你已经知道了可以期待的内容,我们来讨论在 Meta 的系统设计面试中常见的问题。

Meta面试中常见的系统设计面试问题

对于下面的每个设计问题,我们将讨论其详细设计的起点,包括其功能性和非功能性需求和高层次设计。

1) 设计一个国际象棋游戏系统

问题陈述: 设计一个两人在线国际象棋游戏。它需要快速且可靠,并支持月活跃用户(MAU),,达到1亿,每人每周玩一局游戏。

我将遵循以下要求来构建棋盘游戏系统:

功能规范:

  • 创建一局游戏: 系统应该能够为两位在线玩家创建一局游戏,并且系统将确保白方先走。排名和评级算法将选择并引导这些玩家进入同一棋盘。
  • 记录每位玩家的状态: 系统应该能够存储游戏信息,每位玩家的走法,以及统计数据,如胜利、失败、最佳开局和最差开局。
  • 有效走法: 系统应该通过一个准确的国际象棋程序确保每一步棋的有效性。任何一方都不能撤销或取消他们的走法。
  • 显示每一步棋: 系统应该显示每一步棋给两位玩家。
  • 游戏结束: 系统应该确保游戏的终止状态,如将死、认输、弃权或平局。

非功能需求:

  • 延迟: 系统的延迟应在100毫秒以内,以确保流畅的游戏体验和快速的响应时间。
  • 可靠性: 即使任何部分出现故障,系统也应继续正常运作。
  • 可扩展性: 系统应支持至少1亿月活跃用户。
  • 一致性: 不同玩家访问的数据应准确并反映游戏的最新状态。
国际象棋的高层次设计

国际象棋的高级设计包含API网关、负载均衡器和不同的服务。玩家可以通过游戏引擎在应用服务器中开始一场比赛。游戏引擎执行各种任务,包括棋步验证、游戏状态管理以及规则执行。同样,游戏引擎的管理器负责管理游戏引擎实例的生命周期,并在各个游戏引擎之间分配负载以优化资源利用,确保可扩展性。WebSocket服务器负责玩家之间的实时通信以及比赛过程中的走法广播。同样,在游戏过程中,所有状态会被实时记录到持久层。

西洋棋的架构设计

2) 设计一个评论审核系统

问题说明: 设计一个自动化的评论审核系统,用于在评论发布前进行管理并审核。

类似的问题有:设计一个实时评论功能.

以下是设计评论管理系统的要求。

功能需求:

  • 用户登录: 需要一个用户认证服务来大规模验证用户身份。
  • 评论提交: 系统应允许用户提交已发布帖子的评论。
  • 自动评论管理服务: 系统应能够自动审查和管理用户评论。
  • 用户通知: 如果用户的评论被发布或因隐私违规被系统拒绝,系统应通知用户。
  • 用户举报: 系统应允许用户举报评论,以便由管理服务重新审查。

非功能性的需求

  • 可用性: 评论审核系统应高度可用,以过滤用户提交的评论内容。
  • 可扩展性: 该系统还应具备可扩展性,以处理大量评论。
  • 可靠性: 系统应在一个或多个组件出现故障时仍能正常运行。
  • 一致性: 评论审核系统应保持一致,所有用户在任何时间都应看到相同的评论的审核状态。
评论审核系统的高级设计

评论审核系统的高级设计包括用户认证服务、评论服务、评论审核服务和 AI/ML 引擎。还需要负载均衡器以在服务器之间均匀分配负载。评论服务使用发布-订阅模式将用户评论转发给评论审核服务。AI/ML 引擎的目的是审查和过滤评论。类似地,持久层存储用户的数据、评论和元数据。

评论系统的高级设计

3) 设计一个推荐引擎

问题陈述: 设计一个推荐系统,为数千万用户提供关于短视频的推荐。

以下是一些设计推荐系统的要求。

功能规范:

  • 用户资料: 系统应该能够创建和管理用户资料。这包括收集用户的基本信息、兴趣、偏好、评分、评论和过去的互动。
  • 搜索和浏览: 用户应该能够搜索特定的视频或通过各种类别或筛选器浏览推荐视频
  • 个性化: 系统应根据用户的反馈个性化调整推荐内容。
  • 实时更新: 系统应该在用户与平台互动时动态更新推荐。这可能包括将实时用户行为数据和视频可用性数据纳入其中。
  • 离线处理: 系统可能需要后台任务来执行任务,如数据预处理、模型训练和推荐生成。这确保了对用户互动的高效响应时间。

非功能需求:

  • 可扩展性: 系统应能够处理越来越多的物品、用户和推荐,而不影响性能。
  • 低延迟: 系统应足够高效,以提供实时的推荐。
  • 隐私: 系统应安全处理用户数据,并实施数据匿名化和加密措施。
  • 安全: 系统应实施技术以防止未经授权的数据访问和泄露数据。
推荐引擎的高级设计概述

推荐引擎的高层次设计包括负载均衡器、应用服务器、推荐服务、数据收集器、大数据处理系统、数据库和离线AI系统。推荐服务将用户的数据和偏好存储在数据库中;同时,它从AI系统获取推荐,并通过应用服务器将这些推荐反映到用户的屏幕上。数据收集器将数据导入大数据处理系统,在那里数据被分析并从中提取有用的见解。同样,经过处理的数据被输入离线AI系统,在那里离线训练预测模型,以增强用户推荐的性能和准确性。

推荐引擎的高层次设计

4) 设计 Dropbox 产品

问题说明: 设计一个可扩展且安全的系统,以使用户能够在不同设备之间存储、共享及访问文件,适用于Dropbox。

类似的问题包括 : 设计 Google Drive 和一个协作式文档编辑系统(谷歌文档)._

我将考虑以下针对 Dropbox 系统的要求:

功能需求:

  • 上传文件: 用户能够将文件上传到存储服务器。
  • 下载文件: 系统允许用户从存储服务器下载文件。
  • 共享文件: 系统允许用户具有不同访问权限地与其他用户共享文件。
  • 创建和删除目录: 用户能够从存储服务器创建和删除目录。
  • 文件同步: 实现文件在不同设备和用户之间的同步。

非功能性需求

  • 耐用性和可靠性: 系统应确保用户数据永不丢失,并正确执行预期功能。
  • 可用性: 用户应能够随时随地访问他们的数据,只要他们有良好的互联网连接。
  • 可扩展性: 系统应支持无限存储和大量用户的读写操作。
  • 安全性: 系统应防止未经授权的访问文件,除了拥有访问权限的人之外。
Dropbox的架构设计

Dropbox的高级架构包括负载均衡器、应用服务器、块服务器、云存储、元数据服务器、消息队列和同步服务器。文件通过块服务器上传或从云存储下载。与每个用户和文件相关的元数据由元数据服务器处理,并存储在元数据存储中。同样,同步服务器负责在多个设备之间同步文件。这些服务会将对云存储中文件所做的更改或对元数据所做的任何更新通知用户。

Dropbox的架构设计

5) 设计 CamelCamelCamel

需求描述: 设计一个像 CamelCamelCamel (C3) 一样可扩展、可靠且高效的 价格跟踪器 系统。

我将考虑以下几点要求:

功能需求:

  • 搜索产品: C3系统应允许用户搜索特定产品。
  • 价格时间线: 系统应允许用户获取产品的价格变化历史。
  • 添加到价格监控列表: 用户应能够通过定义目标价位将产品添加到价格监控列表,并在产品价格下降时收到通知。
  • 查看监控列表: 用户可以将多个产品添加到价格监控列表中,用户可以查看他们添加的所有产品的价格监控列表。

非功能需求

  • 可用性: 服务的可用性是至关重要的,因为多个用户持续与C3服务交互,并依赖该服务获取产品价格信息。
  • 可靠性: 产品数据和价格下降警报应尽可能准确,以向用户提供可靠的服务。
  • 可扩展性: 系统应能够无缝地扩展,以处理不断增加的用户和市场平台。
  • 低延迟: 系统的延迟应尽可能地低。
CamelCamelCamel的高阶设计

C3的高级设计主要由两个服务组成:搜索服务和产品服务。除了这两个服务之外,C3系统通过API网关连接到其他亚马逊服务,从而为潜在客户提供最新的数据。发布-订阅模式将这些服务解耦,并使它们之间能够进行通信。搜索服务支持客户的搜索查询,而产品服务则向用户推荐产品并通过发布-订阅模式向客户通知价格变化。

CamelCamelCamel的高层次设计

6) 设计 Instagram

问题陈述: 设计一个可扩展和稳健的社交媒体平台,类似Instagram的,该平台允许用户分享照片和视频,关注其他用户,点赞或点踩帖子内容,并接收实时通知。

我将着重于以下需求:

功能需求:

  • 发布照片和视频: 用户应该能够在 Instagram 上发布照片和视频。
  • 关注和取消关注用户: 用户应该能够在 Instagram 上关注和取消关注其他用户。
  • 点赞或不喜欢帖子: 用户可以对他们关注的账户的帖子进行点赞或不喜欢。
  • 搜索照片和视频: 用户可以根据标签和位置搜索照片和视频。
  • 查看动态流: 用户可以查看包含照片和视频的动态流。

非功能需求:

  • 可扩展性: 系统应具有可扩展性,以处理大量用户。
  • 可靠性: 系统应能够容忍硬件和软件故障。
  • 延迟时间: 生成新闻推送的延迟时间应很低。
  • 可用性: 系统应高度可用。
  • 耐久性: 任何上传的内容(照片和视频)不应丢失或损坏。

深入了解Instagram的设计细节(点击链接可查看)设计

第七) 设计 WhatsApp 应用程序

问题陈述: 设计一个高度可扩展性且高度安全的消息传递系统,像WhatsApp一样。

类似的问题: 设计Facebook Messenger应用。

我会考虑以下 WhatsApp 设计的要求:

功能需求

  • 对话: 系统应支持用户之间的一对一和群组对话。
  • 确认: 系统应支持消息送达确认,例如已发送、已送达接收方和已读。
  • 分享: 系统应支持分享媒体文件,如图片、视频和音频。
  • 聊天存储: 系统必须支持离线时聊天消息的持久存储,直到消息成功送达。
  • 推送通知: 系统应能在用户变为在线状态时通知他们有新消息。

非功能性需求

  • 可扩展性: 系统应具有高度的可扩展性,以支持大量用户和每日消息数量。
  • 安全性: 系统必须通过端到端加密来保证安全。
  • 低延迟: 用户应该能够低延迟地接收消息。
  • 一致性: 消息应按发送顺序准确递送。此外,用户在其设备上必须看到相同的聊天记录。
  • 可用性: 系统应具有高度的可用性。然而,为了保证一致性,可用性可以被适当降低。

详细了解WhatsApp的设计(https://www.educative.io/courses/grokking-the-system-design-interview/system-design-whatsapp)。
(注:原文末尾的方括号链接在中文中通常用圆括号表示,以符合中文阅读习惯。)

8) 设计一个网页抓取系统

问题陈述: 假设你能够访问数百万台计算机,。设计一个网络爬虫系统,可以下载所有这些计算机上的内容以不被检测的方式。

我将重点关注网络爬虫系统的以下要求:

功能规范:

  • 爬行: 系统应从系统管理员最初提供的种子URL队列中开始爬行所有由种子URL指向的计算机。
  • 存储: 系统应能够提取并将URL的内容存储到存储库中。
  • 调度: 由于爬行是重复进行的,系统应具有定期调度以更新存储库中的记录。

非功能性需求:

  • 可扩展性: 系统本质上应该是分布式的和多线程的,因为它必须从数百万台计算机中获取数据。
  • 一致性: 由于我们的系统涉及多个爬虫工作者,确保所有爬虫工作者之间的数据一致性是必要的。
  • 性能: 系统应该足够智能,以限制其对特定域名的爬取,可以通过限制访问时间或访问该域名的URL数量来实现。

深入了解网络爬虫的设计

9): 设计一个分布式缓存系统

问题描述: 设计一个可扩展且具有容错能力的分布式缓存系统,通过快速访问频繁请求的数据来提高 web 应用程序的性能表现。

我将考虑以下几点来设计分布式缓存系统:

功能需求:

  • 插入数据到缓存: 分布式缓存系统的用户必须能够将数据插入缓存中。
  • 检索数据: 用户应该能够通过特定的键从缓存中检索数据。

非功能需求:

  • 高性能: 缓存的主要目的是实现快速的数据访问。
  • 可扩展性: 缓存系统应能够处理不断增加的用户和请求。
  • 可用性: 缓存系统应具有高可用性,以提供不间断的服务给用户和应用程序。
  • 一致性: 无论从主服务器还是辅助服务器获取,缓存服务器上的数据都应保持一致。

深入了解该分布式缓存的详细设计方案。

如何在Meta公司获得工作机会

系统设计面试是您作为软件工程师、技术领导或团队负责人职业发展中的一个关键环节。您在其中的表现可能意味着您能否获得梦寐以求的工作或被降级到较低的级别。

我希望这篇文章能帮助你更有信心,对面试中可能会遇到什么有所期待,但更重要的是,我希望你能认真准备面试。竞争非常激烈,准备是你成功的关键。

在 Educative,我们提供了多种不同的由行业专家、博士和前 FAANG 工程师撰写的 系统设计课程系列,您可以在这些课程中更好地理解系统设计的基础知识,并通过实际问题进行动手实践。请参见下方的相关课程:

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
手记
粉丝
70
获赞与收藏
317

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消