聊聊系统设计

如何准备面试中的系统设计问题

目标

学习和实现大型分布式系统并不是一件容易的事。我不希望让你产生一个月就能全部学会的错觉。这篇文章的目标是让软件工程师和学生大致了解设计大型软件的思维过程,以及大型公司如何解决真正困难的问题。除此之外,最近有一种趋势,即公司对系统设计问题进行开放式面试,如果各级工程师没有机会自己研究这些系统,那对他们来说很困难。

这些链接/文档主要用于以下方面:
a) 准备设计系统或者开放式面试
b) 进一步了解大型系统如何工作,以及设计新系统的思维过程

目录

开始

请浏览以下课程,对系统设计有一个概览,这非常有帮助:

这些讲座会在系统设计上给你启发。

基础

在我看来,学习开始前,以下的这些主题(没有特殊顺序),你应该已经掌握

  1. 操作系统基础:一个文件系统、虚拟内存、分页、指令执行周期等如何工作(对于初学者来说这些已经足够了。如果你已经有了足够的知识,试试看操作系统上的安装手册)

  2. 计算机网络基础:应该知道TCP/IP协议栈,Internet、Http、TCP/IP的基础工作原理。Youtube上cs75这门课程会给你一个概览。我个人喜欢networking-a top down approach

  3. 并发基础:线程,进程,用你所知道的语言编写线程。锁,互斥等等

  4. 数据库基础:数据库类型(SQL vs NoSQL等等),哈希和索引,基于ENV的数据库,分片,数据库缓存,主从等等

  5. Web体系结构基础:负载均衡,代理服务,数据库服务,缓存服务,预处理,大日志等等。只需大致了解每层的用途。

  6. 关于什么是CAP理论的基础总结(很少有人会问这个定理的定义,但是知道它会帮助你设计大规模的系统)

面试中如何回答

  • 我觉得hiredintech的视频是一个很好的开端。如何处理链接中给出的设计问题的方法非常有用。它涉及到我们如何从清除系统的用例开始,然后以各种组件和交互的抽象方式进行思考。考虑系统的瓶颈,以及对你的系统更重要的是什么(例如延迟、可靠性、正常运行时间等),解决那些权衡你的方法的问题。

  • system design in crack the coding interview:如何解决一个问题,首先解决一个小用例,然后扩展系统

  • 准备此类问题最好的途径就是进行模拟面试,选择任何主题(如下所示)试着想出一个设计,然后去思考它是如何以及为什么以这种方式设计。除了练习,别无选择!!!白板系统设计问题类似于实际编写和测试代码!只读书只会带你走这么远。

面试中处理系统设计问题的步骤

这些是我在面试中所经历的步骤,来自于真实的面试经历:

  • a) 你一定要听懂面试官的提问,一开始就澄清,而不是假设。

  • b) 用例。这很关键,你必须知道系统将用于什么,它将用于什么样的规模。此外,诸如每秒请求、请求类型、每秒写入的数据、每秒读取的数据等约束。

  • c) 解决一个非常小的问题,比如100个用户。这将大体上帮助你了解整个模型的数据结构、组件和抽象设计。

  • d) 写下到目前为止计算出的所有组件以及他们如何相互作用。

  • e) 根据经验,至少记住这些:

    1. 处理和服务器

    2. 存储

    3. 缓存

    4. 并发和通信

    5. 安全

    6. 负载均衡和代理

    7. CDN

    8. Monetization:如果相关,你会如何monetize?例如选择哪种数据库(Postgres数据库够用吗,如果不够用那是为什么呢?),选择哪种缓存及缓存哪些内容,安全是首要关注的问题吗?

  • f) 所问问题的特殊样例。比如说设计一个存储缩略图的系统,一个文件系统是否足够?如果你必须扩展到Facebook或者Google呢?基于NoSQL的数据库能工作吗?

  • g)在这些准备就绪后,我通常尝试做的是根据用例在不同的地方寻找小的优化,各种折衷将有助于在99%的情况下更好的扩展。

  • h) 系统水平或垂直扩展

  • i) 和面试官确认一下,他还有什么特殊样例需要解决吗?此外,如果你知道你正在面试的公司,它的架构是什么,面试官会对基于公司的什么更有兴趣,以及他在做什么,这真的很有帮助。

通用设计回答

这通常取决于你做什么及你希望做什么。还有你的水平,但这些是一些更常见的面试问题。

  • 设计Amazon经常浏览的产品页面(例如显示你看到的最后5个物品)

  • 为多人游戏设计一个在线扑克游戏,解决持久化、并发性和规模。画一个ER图

  • 设计一个URL压缩系统

  • 搜索引擎(通常是问那些有领域知识的人):基本爬虫,收集,哈希等等。这取决于你的在这个话题上的专长。

  • 设计dropbox的架构关于这个话题的一些讲座

  • 设计一个图片共享网站。你如何存储缩略图,用图片?使用CND?在不同层做缓存等等。

  • 设计一个新的feed(比例Facebook,Twitter):new feed

  • 设计一个基于地图的产品,比如给一个位置查找附近的酒店/ATM。

  • 设计支持申请,释放,回收机制的系统。使用什么样的数据结构?

  • 设计一个类似于junglee.com的网站。例如价格比较,电商网站的可用性。什么时候缓存,查询量是多少,如何有效的爬取整个电商网站,数据库分片,基础数据库设计。

  • 用于即时消息传递的Web应用程序,比如whatsapp,facebook chat。每个问题,扩展问题,状态和可用性通知等等。

  • 设计一个同时协作文档的系统。(例如google docs

  • (非常普通:)运行中的数据流里的Top n或者最常出现的数据项。

  • 设计选举委员会架构。假设我们与选举委员会合作,在计数日,我们希望整理全国各地投票亭的十万票。每个展位都有一台投票机,当连接到网络时,返回{[party_id, num_votes], [party_id_2, num_votes_2], …}。我们希望收集这些并实时获得当前分数。我们需要不断的报告每个政党领导的席位数量。请为此设计一个系统。

  • 设计一个日志系统(对于Web应用,通常有大量服务器运行相同的应用程序,前面有一个负载均衡器来分配传入的请求。在这种情况下,我们希望检查并发出警报,以防在任何服务器中引发异常。我们想要一个系统来在任何服务器日志中检查特定的单词,例如’Exception’、’Disk Full’等。你会如何设计这个系统?)

架构

就我个人而言,我研究了以下架构:

公司工程博客链接

致敬checkcheckzz
根据不同的面试公司,浏览不同公司的博客。面试中非常有用!如果你对架构有所了解,那将非常有用,因为所提出的问题通常属于该公司,你的先前知识将为你提供帮助。

时间不够?

我强烈建议你不要走捷径,除非距离面试日期只剩一星期左右,系统设计最好通过练习来学习,捷径可能会在短期内帮助你,但建议面试后再回顾这些知识,以便深入了解。

  • a)通过上面给出的cs76和Udacity的链接来扩展系统

  • b)浏览你正在面试的公司的工程博客(或者如果它是创业公司的话,浏览最近的公司链接)

  • c)看这个讲座: http://www.hiredintech.com/system-design/the-system-design-process/ ,并且思考下如何回答这些问题

  • d)记住这些术语,只需在你的面试中将他们翻过来,如果相关,请在面试中提及

    1. 进程和服务器

    2. 存储

    3. 缓存

    4. 并发和通信

    5. 安全

    6. 负载均衡和代理

    7. CDN

    8. Monetization

原文链接

https://github.com/shashank88/system_design

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

© 2018-2019 惜春令 京ICP备18010644号 网站地图