第十章
这笔记是我在上周飞旧金山的飞机上写的,写的比较多。
第十章是系统设计以及scalability,这个其实比算法要难,主要是没有什么经验
10.1 设计一个数据服务系统,你需要设计development,rollout,ongoingmonitoring, maintenance of feeding
首先,我不懂那几个名词到底啥意思
我理解的数据服务系统是这样的,本质上是一个远程只读数据库,用户通过TCP传输简单message,然后根据需要
传输数据,数据传输的检测和维护,可以直接交给TCP的机制完成。然后没了。(BTW,现在cluster间的传输模式主要是MPI,而MPI是使用TCP的协议的)
我突然发现其实network这个东西还是很重要的。http也是使用TCP协议。
当然我怀疑这样在面试中应该是死得惨惨的
书上是这么分析的:
1. 用户要好用
2. 系统要尽可能简单
3. 在现实生活中,要考虑future demand
4. scalability 以及 efficiency
方法一:直接plain txt download,问题是这样是由用户来做parsing
方法二:直接一个database,rollback之类的就解决了,问题是,我们不需要大部分的SQL的功能。而且我们需要额外
的层去检查数据。
方法三:XML,XML是share data的标准方法,大部分语言都可以兼容。但是XML必须给用户所有数据,query会是
一个问题
然后提到说,可以使用一个web service做一个外层,所以httprequest应该也是work的,应该用http。。。
所以,我的答案其实不算太糟糕
10.2 设计一个数据结构, 做social network,完成connectivity的算法
首先的想法就是维护每个人两个set,然后connectivity用BFS解决。
一个问题就是在这类老掉牙的问题里面,set好还是list就够了
如果做BFS,你需要遍历所有的element,所以基本上是没有区别,set的好处在于检测,比如说谁是不是你的好友这种
但是memory的使用总是要大一些。
书上给出了一个关于大量数据的时候咋办的解决方案
第一点是用ID作为identifier
然后每个人的大部分数据可能在不同的机器上,所以需要一个personID 到 machineID的map
然后就是需要一个叫做machine的class,可以从给定的machineID获得person的实际数据
然后书上没有讲的问题是,具体怎么实现从不同机器拿到ID的问题
我的理解是,每一个机器都要维护同样结构的full map,然后需要得到person的数据的时候,使用TCP传输。
确实需要知道一般cluster数据都是怎么传输的,这个我特么还真的不是很清楚。
减少machine jumps,可能需要在同一个机器里面做完这个机器里面有的search
另外关于BFS,根据书上的结论,似乎可以在每一层尽量使用朋友最多的那些人开始search,但是这个显然需要一些工作,
但是实际上很难解决时候先search最多的那个,因为如果你把朋友个数同时implement了,那么当你修改数据的时候,你
全网络都要改,很麻烦。除非允许不同步。
另外就是可以做一级或者多级缓存。
10.3 给你40亿正整数,找一个不存在数,你的内存是1GB,
40亿整数是16GB,但是40亿就是2^32,可以使用整个内存,也就是8Gb,然后做一个巨大的数组。。。。
如果只有10MB的时候该怎么做呢,给出的做法非常有意思,先把2^32分割成N份,然后先记录在连续的每一份里面。10MB是2^23,
所以range size就是2^31/2^23。
然后再做第二轮计数。
这题怎么觉得像是programming pearls里面的
10.4 4KB memory,找到所有的duplicatevalue,你有1到N的所有数字,N最大32000
4KB 是多少bit, 32000.。。。。
既然就是所有数字,一旦检测已存在就print。。
10.5 web crawler,如何避免infiniteloop
所有的agent 共享一个state map? 我的想法
然后书上说了问题主要在于如何定义the same的问题,URL中得parameter可能是一个问题。而内容分析可能也不够好
书上的做法是,生成一个signature,然后根据signature进行检测,如果最近检测过,那么就放到database的lowpriority区域
10.6 你有100亿个URL,如何找到duplicate one
方法一,这个很重要,就是你还是有机会把duplicate放在同一个disk里面的。就是用一个hash function,然后hash(u)/memorysize
然后可以调节这个size,使得你可以放进memory,之后就是建一个hash table。当然有一个问题就是hashtable所用的memory基本上
是不确定的。。。。。
方法二: 多机器一起操作。需要考虑failure的问题
10.7 建立一个简单的网络搜索引擎,100个机器用来respond to query, 然后另外的一个cluster用来做query,每次具体机器
并不确定,并且process search非常昂贵。问如何cacheresult,以及data 变了之后如何update
先说说我的想法,首先第一个问题是,使用什么样的结构来保存cache,必须是一个query本身作key的map。然后这个map必须是频
繁地在所有的processing cluster上共享。然后update的问题,假设map本身是fix size的,那么replace谁呢?只能是replace最久没有被
检查到的,但是这样的话,map似乎就不是一个好选择了。似乎应该使用一个deque,凡是被最近查询的都放在最前面,然后新查询的
调换最后一个,同时用一个hashmap去maintian这个deque的index 查询
基本上跟书上给出的第一种方法一致。书上用的是linkedlist加map,map直接map到Node上,但是应该是map到node的 pointer上
当然我不知道java是不是直接就是reference。
但是没有说关于update的问题,如果网页变了,你咋办?
似乎最好的办法就是一个auto time-out,这个可以是这样的,检查进map,如果time out了,就删除并且重新检测。另外time-out的时间
可以根据内容来搞。
最后一题,结果是面试的那家公司给我的题,似乎也是他们目前的问题所在。不过我给了一个更加复杂的方法来做,我觉得那个方法我当时能想到还是很屌的。