当前位置: 首页 > 科技观察

如何一步步设计出一个大型复杂的系统

时间:2023-03-14 16:19:26 科技观察

良好的系统设计能力是一个优秀程序员必备的素质,体现了处理复杂问题的能力,也是你能否获得相应职位的关键而薪水在面试过程中必不可少。最近在https://www.educative.io/上看到一个系统设计的教程:GrokkingtheSystemDesignInterview[1],里面有很多系统设计的例子,比如Dropbox、Twitter、FacebookMessenger、Uber等。Tutorials是收费的,质量非常高,是学习系统设计的极佳资料。本教程中文资料很少。在这里,我将核心内容翻译成中文分享给大家。想阅读英文原版,回复“系统设计”获取。很多软件工程师在系统设计面试(以下简称SDI)中遇到困难,主要有以下三个原因:SDI是非结构化的,往往需要开放式设计,很多问题没有标准答案。他们缺乏开发大型系统的经验。他们没有为SDI做好准备。和编码面试一样,大多数没有准备SDI的候选人都会表现不佳,尤其是在谷歌、Facebook、亚马逊、微软等顶级公司的面试中。如果候选人表现低于平均水平,则获得录取的机会很小非常低。苗条的。另一方面,良好的面试表现总会带来更好的回报,要么是更高的职位,要么是更高的薪水,因为它显示了应聘者处理复杂系统的能力。接下来,我们将按照以下步骤逐步解决多个设计问题:第一步:需求澄清在需求范围内提出问题有助于澄清需求。设计题大多是开放式的,没有一个标准答案,所以需要明确一些具体的要求。花足够的时间来定义系统的最终目标将有助于您在面试中取得成功。另外,由于系统设计面试只有35-40分钟,所以我们应该弄清楚哪些部分是重点。以设计类似Twitter的服务为例,在开始设计之前应回答以下问题:我们服务的用户可以发推文并关注其他人吗?我们还应该设计来创建和显示用户的时间线吗?包括照片和视频吗?我们只关注后端还是前端?用户可以搜索推文吗?我们需要展示热门话题吗?是否有新(或重要)推文的推送通知?设计的系统是什么样子的。第二步:系统接口定义定义系统的预期接口(API),不仅可以帮助建立预期的接口协议,还可以保证我们没有误解需求。例如,类似Twitter的服务的界面可能如下所示:第三步:资源估算估算我们要设计的系统的规模是非常必要的,这将有助于我们进行后续的系统扩展、分区、负载均衡和缓存的设计。系统的预期规模,例如新推文的数量、阅读的推文数量、每秒生成的时间线?我们需要多少存储空间?如果用户可以拍照和录像,我们需要多少存储空间。我们期望多少带宽?这对于确定我们如何管理流量和平衡服务器之间的负载至关重要。第4步:设计数据模型尽早定义数据模型有助于理解数据如何在不同组件之间流动。数据模型将指导数据分区和管理。设计人员应该确定系统的各种实体,它们如何相互交互,以及数据管理的方面,如存储、传输、加密等。以下是我们类似Twitter的服务的一些实体:用户:用户ID、姓名、电子邮件、DoB、CreationData、LastLogin等Tweet:TweetID、Content、TweetLocation、NumberOfLikes、TimeStamp等UserFollowo:UserdID1、UserID2FavoriteTweets:UserID、TweetID、TimeStamp我们应该使用哪个数据库系统?像Cassandra这样的NoSQL是否最适合我们的需求,还是我们应该使用像MySQL这样的解决方案?我们应该使用哪种块存储来存储照片和视频?第5步:高级设计用5-6个框表示我们系统的核心组件。我们应该确定足够的组件来解决端到端的问题,对于Twitter,我们将需要多个应用服务器来服务所有的读/写服务,并配置负载均衡器来分配流量。如果读流量大于写流量,我们可以使用单独的服务器来处理这些情况,比如分配10台服务器为读请求服务,2台服务器为写请求服务。在后端,我们需要一个高性能的数据库,可以存储所有推文,并支持大量读取。我们还需要一个分布式文件存储系统来存储照片和视频。第6步:详细设计深入到两个或三个组件;面试官的反馈指导我们进一步的讨论。我们应该能够提出不同的方法、它们的优点和缺点,并解释为什么我们会选择其中一种。记住,没有标准答案,唯一重要的是如何在资源有限的前提下做出取舍。由于我们将存储大量数据,我们如何将数据分区以分发到多个数据库?我们是否应该尝试将所有用户的数据存储在同一个数据库中?它会导致什么问题?如何处理推特很多或关注很多人的用户?由于用户的时间线将包含最新的推文,我们是否需要优化数据访问以获取最新的推文?我们应该引入多少层缓存来加快处理速度?哪些组件需要更好的负载平衡?第七步1:识别和解决瓶颈尽可能多地识别瓶颈并提出不同的缓解方法。例如:我们的系统是否存在单点故障?应该采取什么措施来缓解这种情况?在多少台服务器宕机的情况下,我们是否有足够的数据备份来继续为用户提供服务?同样,我们是否有足够数量的不同服务在运行,以至于即使某些服务出现故障,系统也不会崩溃?我们如何监控我们的服务绩效?我们是否会在组件故障或性能下降等关键时刻收到警报?Finalwordinbrief也就是说,面试前充分的准备是系统设计面试成功的关键。以上步骤可以指导我们设计一个复杂的大型系统,涵盖面试问题的不同方面。后面的面试题,可以参考上面的步骤来思考和回答。参考资料[1]GrokkingtheSystemDesignInterview:https://www.educative.io/courses/grokking-the-system-design-interview代码注意。转载本文请联系Python七号公众号。