如何一步一步设计一个大规模复杂的系统
时间:2025-11-05 09:24:27 出处:应用开发阅读(143)

良好的何步系统设计能力,是步设一个优秀程序员的必要素质,反应出了处理复杂问题的大规能力,也是模复面试过程中能否获得相应的职位和薪酬的关键。
最近在 https://www.educative.io/ 上看到一份介绍系统设计的系统教程:Grokking the System Design Interview[1],里面有很多系统设计实例,何步如 Dropbox,步设 Twitter, Facebook Messenger, Uber 等,教程是大规收费的,质量很高,模复学习系统设计的系统绝佳资料,该教程的何步中文资料很少,这里就将其中的步设核心内容翻成中文与大家分享,如果需看英文原版,大规回复「系统设计」即可获取。模复
许多软件工程师在系统设计面试(以下简称 SDI)时遇到困难,系统主要有三个方面原因:
SDI 具有非结构化性质,往往要求开放式设计,很多问题没有标准答案。 他们缺乏开发大型系统的经验。 他们没有为 SDI 做准备。服务器租用像编码面试一样,没有认真准备 SDI 的应聘者,大部分表现不佳,尤其是在 Google,Facebook,Amazon,Microsoft 等顶尖公司的面试,如果表现不及平均水平的候选人,获得获得 offer 的机会非常渺茫。另一方面,良好的面试表现总是会带来更好的回报,或者是更高的职位,或者是更高的薪水,因为这显示了候选人处理复杂系统的能力。
接下来,我们将按以下步骤循序渐进地解决多个设计问题:
第一步:需求澄清
在需求范围内提出一些问题有助于澄清需求。设计问题大多是开放性的,并且没有一个标准答案,免费源码下载这就是为什么要澄清一些具体需求。花费足够时间来定义系统最终目标有助于在面试中获得成功。另外,由于系统设计的面试只有 35-40 分钟的时间,我们应该弄清楚哪些部分需要重点关注。
以设计一个类 Twitter 的服务为例,在开始设计之前应先回答以下问题:
我们服务的用户能否发布推文并关注其他人? 我们是否还应该设计来创建和显示用户的时间轴? 推文中是否包含照片和视频? 我们是仅专注于后端还是前端? 用户将能够搜索推文吗? 我们需要显示热门话题吗? 是否有关于新(或重要)推文的推送通知?这些问题将决定最终设计的系统长什么样。
第二步:系统接口定义
定义系统期望的接口(API)不仅可以帮助建立预期的接口协议 ,也可以确保我们没有弄错需求。比如类似 Twitter 的服务的接口可能是这样的:
postTweet(user_id, tweet_data, tweet_location, user_location, timestamp, …) generateTimeline(user_id, current_time, user_location, …) markTweetFavorite(user_id, tweet_id, timestamp, …)第三步:资源预估
预估我们要设计的系统的规模是非常必要的,云南idc服务商有助于我们后续的系统扩展、分区、负载平衡和缓存的设计。
系统预期的规模,例如,新推文的数量,推文的阅读量,每秒产生的时间线? 我们需要多少存储空间?如果用户可以拍摄照片和视频,又需要多少存储空间。 我们期望多大的带宽?这对于决定我们如何管理流量和平衡服务器之间的负载。第四步:设计数据模型
早一点定义数据模型可以弄明白数据如何在不同组件之间进行流转。数据模型将指导数据分区和管理。设计者应该识别系统的各个实体,它们之间的交互方式以及 数据管理的各个方面,例如存储、传输、加密等。以下是我们的类 Twitter 服务的一些实体:
User:UserID, Name, Email, DoB, CreationData, LastLogin 等。 Tweet:TweetID,Content,,TweetLocation,NumberOfLikes,TimeStamp等。 UserFollowo:UserdID1,UserID2 FavoriteTweets: UserID, TweetID, TimeStamp我们应该使用哪个数据库系统?像 Cassandra 这样的 NoSQL 是否最适合我们的需求,还是应该使用类似于 MySQL 的解决方案?我们应该使用哪种块存储来存储照片和视频?
第五步:高级设计
画一个带有 5-6 个方框的图,代表我们系统的核心组件。我们应该识别出足够的组件来解决端到端的问题,对于 Twitter 而言,我们将需要多个应用服务器来服务所有的读/写服务,并配置负载平衡器进行流量分配。假如读流量大于写流量,我们可以使用单独的服务器进行处理这些情况,比如分配 10 台服务器服务读请求,2 台服务器服务写请求。在后端,我们需要一个高性能的数据库,该数据库可以存储所有推文并支持大量读取。我们还需要一个分布式文件存储系统来存储照片和视频。

第六步:详细设计
深入挖掘两个或三个组成部分;面试官的反馈意见引导我们进一步讨论。我们应该能够提出不同的方法,它们的优点和缺点,并说明为什么我们会选择另一种方法。请记住,没有标准答案,唯一重要的是有限资源前提下怎么做出权衡。
由于我们将存储大量数据,因此如何将数据分区到分发到多个数据库?是否应该尝试将用户的所有数据存储在同一数据库?它会导致什么问题? 如何处理发大量推文或关注很多人的热门用户? 由于用户的时间轴将包含最新推文,为了获取最新推文是否需要优化数据的存取方式? 我们应该在多少层引入缓存以加快处理速度? 哪些组件需要更好的负载平衡?第七步:找出并解决瓶颈
找出尽可能多的瓶颈问题,并提出缓解这些瓶颈的不同方法。比如:
我们的系统中是存在单点故障?应该采取什么措施缓解这种情况? 我们是否有足够的数据备份,在多少台服务器宕机的情况下仍可以为用户提供服务? 类似的,我们是否有足够数量的不同服务在运行,即使一些服务有故障也不会会导致系统崩溃? 我们如何监控我们的服务性能?关键时刻比如组件发生故障或性能下降时会收到报警吗?最后的话
简而言之,面试前有足够的准备是系统设计面试成功的关键,上述步骤可以指导我们设计一个复杂的大规模系统,涵盖了的不同方面的面试问题,后续的面试问题,可以参考以上步骤来思考和回答。
参考资料
[1]Grokking the System Design Interview: https://www.educative.io/courses/grokking-the-system-design-interview
本文转载自微信公众号「Python七号」,可以通过以下二维码关注。转载本文请联系Python七号公众号。

猜你喜欢
- 从U盘安装电脑系统的完全指南(学习如何使用U盘来安装和重装电脑系统)
- 互联网巨头都在研究的无服务器架构,看完收获满满
- 聚焦行业新风口 白鹭科技云游戏战略发布会成功举办
- 分布式文件服务器你还在手动搭建?快来试试Docker镜像一步搞定
- deepin 2014.3为修正版本,该版本主要对系统和软件Bug进行了全方面修复和性能调优,同时对系统功能和UI界面进行了微调。关于系统支持语言方面,deepin 2014.3现已增至23种。deepin致力于为全球用户提供美观易用、安全可靠的Linux系统。deepin系统使用基于HTML 5技术开发的深度桌面环境,搭配深度音乐、深度影院、WPS和搜狗输入法等软件,能够满足用户的日常娱乐和办公需求。截至目前,deepin系统累计下载量数千万次,用户遍布全球40多个国家和地区,成为在Distrowatch上排名最高的中国Linux发行版。deepin 2014.3为修正版本,该版本主要对系统和软件Bug进行了全方面修复和性能调优,同时对系统功能和UI界面进行了微调。关于系统支持语言方面,deepin 2014.3现已增至23种(加粗为新增语言):英语、简体中文、繁体中文、法语、德语、俄语、西班牙语、印尼语、意大利语、土耳其语、葡萄牙语、葡萄牙语(巴西)、波兰语、罗马尼亚语、荷兰语、匈牙利语、捷克语、希腊语、丹麦语、斯洛伐克语、保加利亚语、阿拉伯语、希伯来语此外,deepin还拥有较为完备的社区文档、遍布全球的近70个镜像站,让世界各地的用户均能体验到deepin系统的无限魅力。系统修复本次,我们重点对任务栏和控制中心进行了修复和优化,使得deepin 2014.3体验和稳定性得到了较大改善。Bug修复系统新增浅色主题,同时修复深色主题部分显示问题修复任务栏低概率的预览出错问题修复任务栏在不同模式下对桌面大小的处理问题修复任务栏通知区域蓝牙、时间插件等信息不及时同步的问题修复任务栏通知区域崩溃后自动重启,导致输入法无法使用的问题修复启动器第一次启动时,输入法默认为中文的问题修复启动器不及时显示新安装软件图标的问题修复控制中心蓝牙功能不稳定的问题修复控制中心时间和时区设置的问题修复控制中心VPN连接和组件等问题修复触摸屏无法使用的问题…软件修复修复QQ频繁崩溃的问题调整深度启动盘制作工具界面,新增镜像文件和U盘盘符的显示修复深度音乐,豆瓣插件语言显示为英文的问题修复深度商店,检测系统更新失败的问题修复深度影院,对部分特殊视频预览图获取失败的问题修复深度影院,对葡萄牙语等语言的显示不全的问题…系统优化任务栏性能优化,减少内存占用重构控制中心部分代码,优化性能优化桌面热区和任务栏提示信息触发时间,减少误操作优化任务栏通知区域插件的稳定性优化任务栏通知区域音量插件交互优化控制中心—网络模块和任务栏通知区域,Wi-Fi密码输入框的交互其他UI界面微调…预装软件在修复系统和软件Bug的同时,我们对系统底层组件进行了升级,并对部分重要的预装软件进行调整:简体中文环境下,使用有道词典for Linux V1.0取代深度翻译的预装升级深度影院至2.2.1版本,提供更为全面的字幕设置升级深度截图至最新的3.0版本,提供更为简洁、易用的截图体验升级QQ至6.8版本,改善QQ的稳定性和性能…升级与安装升级假如您已安装deepin系统,您可使用升级脚本对系统进行升级,使用方法为桌面右键打开深度终端,执行以下命令:sudo apt-get update && sudo apt-get install deepin-os-upgrader -y && os-upgrade友情提示:本升级脚本仅支持deepin 2014.1或deepin 2014.2版本当使用升级脚本需要您输入密码时,请盲打当前帐号密码后回车务必使用该升级脚本对deepin系统进行升级,请不要使用深度商店进行升级,否则可能出现系统升级后无法启动等问题安装假如您为deepin系统新用户,请选择以下任一渠道下载deepin 2014.3镜像,然后观看安装视频教程(或文本教程)进行安装。官方下载:32位:点此下载(MD5值:036dda2007b0bf325b97ab3e0fe4a85a)64位:点此下载 (MD5值:e9b6145ba9c0d21632936361dbe74a18)开源宣言deepin系统是一款针对普通用户而发行的开源系统,欢迎自由下载、分发和使用。deepin系统严格遵守开源协议,您可自由的获取deepin系统源码:GitCafe:https://gitcafe.com/DeepinGitHub:https://github.com/linuxdeepin
- 华为反击!向Verizon要专利费 美国终于坐不住了
- GitHub宣布收购Pull Panda且免费提供服务
- 一文了解和 Spring Bean 有关的那些注解
- 夏普830a手机评测(性能出众,拍照强悍,用户体验卓越)