《PHP程序员面试笔试宝典》——如何回答系统设计题?

如何巧妙地回答面试官的问题?

本文摘自《PHP程序员面试笔试宝典》

应届生在面试时,偶尔也会遇到一些系统设计题,而这些题目往往只是测试求职者的知识面,或者测试求职者对系统架构方面的了解,一般不会涉及具体的编码工作。虽然如此,对于此类问题,很多人还是感觉难以应对,也不知道从何处答题。

如何应对此类题目呢?在正式介绍基础知识之前,首先列举几个常见的系统设计相关的面试、笔试题。

题目1:设计一个DNS的Cache结构,要求能够满足5000次/s以上的查询,满足IP数据的快速插入,查询的速度要快(题目还给出了一系列的数据,比如站点数总共为5000万、IP地址有1000万等)。

题目2:有N台机器,M个文件,文件可以以任意方式存放到任意机器上,文件可任意分割成若干块。假设这N台机器的宕机率小于33%,要想在宕机时可以从其他未宕机的机器中完整导出这M个文件,求最好的存放与分割策略。

题目3:假设有30台服务器,每台服务器上面都存有上百亿条数据(有可能重复),如何找出这30台机器中,根据某关键字重复出现次数最多的前100条?要求使用Hadoop来实现。

题目4:设计一个系统,要求写速度尽可能快,并说明设计原理。

题目5:设计一个高并发系统,说明架构和关键技术要点。

题目6:有25TB的log(query->queryinfo),log在不断地增长,设计一个方案,给出一个query能快速返回queryinfo。

以上所有问题中凡是不涉及高并发的,基本可以采用Google的三个技术解决,即GFS、MapReduce和Bigtable,这三个技术被称为“Google三驾马车”。Google只公开了论文而未开源代码,开源界对此非常有兴趣,仿照这三篇论文实现了一系列软件,如Hadoop、HBase、HDFS及Cassandra等。

在Google这些技术还未出现之前,企业界在设计大规模分布式系统时,采用的架构往往是DataBase+Sharding+Cache,现在很多网站(比如淘宝网、新浪微博)仍采用这种架构。在这种架构中,仍有很多问题值得去探讨,如采用哪种数据库,是SQL界的MySQL还是NoSQL界的Redis/TFS,两者有何优劣?采用什么方式sharding(数据分片),是水平分片还是垂直分片?据网上资料显示,淘宝网、新浪微博图片存储中曾采用的架构是Redis/MySQL/ TFS+Sharding+Cache,该架构解释如下:前端Cache是为了提高响应速度,后端数据库则用于数据永久存储,防止数据丢失,而Sharding是为了在多台机器间分摊负载。最前端由大块的Cache组成,要保证至少99%(淘宝网图片存储模块是真实的)的访问数据落在Cache中,这样可以保证用户访问速度,减少后端数据库的压力。此外,为了保证前端Cache中的数据与后端数据库中的数据一致,需要有一个中间件异步更新(为什么使用异步?理由是,同步代价太高)数据。新浪有个开源软件叫Memcachedb(整合了Berkeley DB和Memcached),正是用于完成此功能。另外,为了分摊负载压力和海量数据,会将用户微博信息经过分片后存放到不同节点上(称为“Sharding”)。

这种架构优点非常明显—简单,在数据量和用户量较小时完全可以胜任。但缺点是扩展性和容错性太差,维护成本非常高,尤其是数据量和用户量暴增之后,系统不能通过简单地增加机器解决该问题。

鉴于此,新的架构应运而生。新的架构仍然采用Google公司的架构模式与设计思想,以下将分别就此内容进行分析。

GFS  是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上,提供容错功能。现在开源界有HDFS(Hadoop Distributed File System),该文件系统虽然弥补了数据库+Sharding的很多缺点,但自身仍存在一些问题,比如由于采用master/slave架构,因此存在单点故障问题;元数据信息全部存放在master端的内存中,因而不适合存储小文件,或者说如果存储大量小文件,那么存储的总数据量不会太大。

MapReduce  是针对分布式并行计算的一套编程模型。其最大的优点是,编程接口简单,自动备份(数据默认情况下会自动备三份),自动容错和隐藏跨机器间的通信。在Hadoop中,MapReduce作为分布计算框架,而HDFS作为底层的分布式存储系统,但MapReduce不是与HDFS耦合在一起的,完全可以使用自己的分布式文件系统替换HDFS。当前MapReduce有很多开源实现,如Java实现Hadoop MapReduce、C++实现Sector/sphere等,甚至有些数据库厂商将MapReduce集成到数据库中了。

BigTable  俗称“大表”,是用来存储结构化数据的。编者认为,BigTable开源实现最多,包括HBase、Cassandra和levelDB等,使用也非常广泛。

除了Google的这“三驾马车”以外,还有其他一些技术可供学习与使用。

Dynamo  亚马逊的key-value模式的存储平台,可用性和扩展性都很好,采用DHT(Distributed Hash Table)对数据分片,解决单点故障问题,在Cassandra中也借鉴了该技术,在BT和电驴这两种下载引擎中,也采用了类似算法。

虚拟节点技术  该技术常用于分布式数据分片中。具体应用场景:有一大块数据(可能TB级或者PB级),需按照某个字段(key)分片存储到几十(或者更多)台机器上,同时想尽量负载均衡且容易扩展。传统做法是:Hash(key) mod N,这种方法最大的缺点是不容易扩展,即增加或者减少机器均会导致数据全部重分布,代价太大。于是新技术诞生了,其中一种是上面提到的DHT,现在已经被很多大型系统采用,还有一种是对“Hash(key) mod N”的改进:假设要将数据分布到20台机器上,传统做法是Hash(key) mod 20,而改进后,N取值要远大于20,比如是20000000,然后采用额外一张表记录每个节点存储的key的模值,比如:

node1:0~1000000

node2:1000001~2000000

……

这样,当添加一个新的节点时,只需将每个节点上部分数据移动给新节点,同时修改一下该表即可。

Thrift  Thrift是一个跨语言的RPC框架,分别解释“RPC”和“跨语言”如下:RPC是远程过程调用,其使用方式与调用一个普通函数一样,但执行体发生在远程机器上;跨语言是指不同语言之间进行通信,比如C/S架构中,Server端采用C++编写,Client端采用PHP编写,怎样让两者之间通信,Thrift是一种很好的方式。

本篇最前面的几道题均可以映射到以上几个系统的某个模块中。

1)关于高并发系统设计,主要有以下几个关键技术点:缓存、索引、数据分片及锁粒度尽可能小。

2)题目2涉及现在通用的分布式文件系统的副本存放策略。一般是将大文件切分成小的block(如64MB)后,以block为单位存放三份到不同的节点上,这三份数据的位置需根据网络拓扑结构配置,一般而言,如果不考虑跨数据中心,可以这样存放:两个副本存放在同一个机架的不同节点上,而另外一个副本存放在另一个机架上,这样从效率和可靠性上,都是最优的(这个Google公布的文档中有专门的证明,有兴趣的读者可参阅一下)。如果考虑跨数据中心,可将两份存在一个数据中心的不同机架上,另一份放到另一个数据中心。

3)题目4涉及BigTable的模型。主要思想:将随机写转化为顺序写,进而大大提高写速度。具体方法:由于磁盘物理结构的独特设计,其并发的随机写(主要是因为磁盘寻道时间长)非常慢,考虑到这一点,在BigTable模型中,首先会将并发写的大批数据放到一个内存表(称为“memtable”)中,当该表大到一定程度后,会顺序写到一个磁盘表(称为“SSTable”)中,这种写是顺序写,效率极高。此时,随机读可不可以这样优化?答案是:看情况。通常而言,如果读并发度不高,则不可以这么做,因为如果将多个读重新排列组合后再执行,系统的响应时间太慢,用户可能接受不了,而如果读并发度极高,也许可以采用类似机制。

更多有趣有料的PHP面试笔试资料可以关注:“琉忆编程库”

或者浏览:www.shuaiqi100.com 获取。

PHP程序员面试笔试宝典下载:https://pan.baidu.com/s/1-ES2ZI3z5Lhv-zTKFmJDSQ

原文地址:https://www.cnblogs.com/leoyi330/p/10041677.html

时间: 2024-08-11 07:40:11

《PHP程序员面试笔试宝典》——如何回答系统设计题?的相关文章

《PHP程序员面试笔试宝典》——如何巧妙地回答面试官的问题?

如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 所谓"来者不善,善者不来",程序员面试中,求职者不可避免地需要回答面试官各种"刁钻".犀利的问题,回答面试官的问题千万不能简单地回答"是"或者"不是",而应该具体分析"是"或者"不是"的理由. 回答面试官的问题是一门很深的学问.那么,面对面试官提出的各类问题,如何才能条理清晰地回答呢?如何才能让自己的回答不至

《PHP程序员面试笔试宝典》——如何回答快速估算类问题?

如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 有些大企业的面试官,总喜欢出一些快速估算类问题,对他们而言,这些问题只是手段,不是目的,能够得到一个满意的结果固然是他们所需要的,但更重要的是通过这些题目可以考查求职者的快速反应能力以及逻辑思维能力.由于求职者平时准备的时候可能对此类问题有所遗漏,一时很难想到解决的方案.而且,这些题目乍一看确实是毫无头绪,无从下手,其实求职者只要冷静下来,稍加分析,就能找到答案.因为此类题目比较灵活,属于开放性试题,一般没有标准答案,只要弄清

《PHP程序员面试笔试宝典》——如何回答技术性的问题?

如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 程序员面试中,面试官会经常询问一些技术性的问题,有的问题可能比较简单,都是历年的面试.笔试真题,求职者在平时的复习中会经常遇到.但有的题目可能比较难,来源于Google.Microsoft等大企业的题库或是企业自己为了招聘需要设计的题库,求职者可能从来没见过或者不能完整地.独立地想到解决方案,而这些题目往往又是企业比较关注的. 如何能够回答好这些技术性的问题呢?编者建议:会做的一定要拿满分,不会做的一定要拿部分分.即对于简单的

《PHP程序员面试笔试宝典》——如何回答算法设计问题?

如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 程序员面试中的很多算法设计问题,都是历年来各家企业的"炒现饭",不管求职者以前对算法知识掌握得是否扎实,理解得是否深入,只要面试前买本<程序员面试笔试宝典>,应付此类题目完全没有问题.但遗憾的是,很多世界级知名企业也深知这一点,如果纯粹是出一些毫无技术含量的题目,对于考前"突击手"而言,可能会占尽便宜,但对于那些技术好的人而言是非常不公平的.所以,为了把优秀的求职者与一般的求

《PHP程序员面试笔试宝典》——如何应对自己不会回答的问题?

如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 在面试的过程中,对面试官提出的问题求职者并不是都能回答出来,计算机技术博大精深,很少有人能对计算机技术的各个分支学科了如指掌.而且抛开技术层面的问题,在面试那种紧张的环境中,回答不上来的情况也容易出现.面试过程中遇到自己不会回答的问题时,错误的做法是保持沉默或者支支吾吾.不懂装懂,硬着头皮胡乱说一通,这样会使面试气氛很尴尬,很难再往下继续进行. 其实面试遇到不会的问题是一件很正常的事情,没有人是万事通,即使对自己的专业有相当的

《Java程序员面试笔试宝典》终于在万众期待中出版啦~

<Java程序员面试笔试宝典>终于在万众期待中出版啦~它是知名畅销书<程序员面试笔试宝典>的姊妹篇,而定价只要48元哦,恰逢求职季节,希望本书的出版能够让更多的求职者能够走进理想的企业 在这里,众多知名企业面试官将为你撕开神秘的求职面纱: 在这里,各种求职达人将现身说法为你揭开求职谜团: 在这里,各种类型的企业招聘细节都会被展露无疑: 在这里,我们将为你抽丝剥茧,还原IT行业的真相: 在这里,我们将为你指点迷津,告诉你职场上的风风雨雨: 在这里,我们将为你点石成金,成为那盏指引你前

《PHP程序员面试笔试宝典》——如何应对面试官的“激将法”语言?

如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> "激将法"是面试官用以淘汰求职者的一种惯用方法,它是指面试官采用怀疑.尖锐或咄咄逼人的交流方式来对求职者进行提问的方法.例如,"我觉得你比较缺乏工作经验""我们需要活泼开朗的人,你恐怕不合适""你的教育背景与我们的需求不太适合""你的成绩太差""你的英语没过六级""你的专业和我们不对口"&

《PHP程序员面试笔试宝典》——如果面试问题曾经遇见过,是否要告知面试官?

如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 面试中,大多数题目都不是凭空想象出来的,而是有章可循,只要求职者肯花时间,耐得住寂寞,复习得当,基本上在面试前都会见过相同的或者类似的问题(当然,很多知名企业每年都会推陈出新,这些题目是很难完全复习到位的).所以,在面试中,求职者曾经遇见过面试官提出的问题也就不足为奇了.那么,一旦出现这种情况,求职者是否要如实告诉面试官呢? 选择不告诉面试官的理由比较充分:首先,面试的题目60%-70%都是已见题型,见过或者见过类似的不足为奇

《Java程序员面试笔试宝典》之字符串创建与存储的机制是什么

在Java语言中,字符串起着非常重要的作用,字符串的声明与初始化主要有如下两种情况:(1) 对于String s1=new String("abc")语句与String s2=new String("abc")语句,存在两个引用对象s1.s2,两个内容相同的字符串对象"abc",它们在内存中的地址是不同的.只要用到new总会生成新的对象. (2) 对于String s1 = "abc"语句与String s2 = "