[面试] 百度一道很大的设计题,海量 user 海量 url 访问的问题!
接下来又是一道很大的设计题:假如有海量的user使用程序模块接口A来检索需要的url,然后A要调用n个功能相同的B模块去访问海量数据的数据库,怎么实现这个系统来解决海量user问题和海量数据问题。
我低头想了一会,然后很快在纸上列出了提纲大致是海量用户和海量数据的针对性解决方案。海量用户吧,不同用户在大时间范围内应该是有并发和先后执行顺序的,在程序执行的小时间片上肯定是先后顺序的。我首先设计了一个消息队列来存放用户的query,(她听到信息队列,点头说对),然后肯定要多线程处理不同用户的请求(她点头),
然后接着说,处理海量数据,可以将海量数据分布式处理,分别交由n个B模块来处理。这时她问怎么分布这些Url,平均或是聚集?我说数量上应该平均,最好是用hash映射一下。她说那你要A怎么调度B模块呢?一个一个还是n个同时运作。我说,一个网页一次能显示的url是有限的,n个B同时返回所有Url还要将没有被显示的存储在A的内存中,这样多个用户请求就要开辟多个存储多余Url的空间,对于海量User相当困难吧,所以我觉得应该一个一个调度,先用一个B的url来满足用户需求,就像去一个很多顾客的餐馆吃饭,总不能把一桌的餐全上齐了再给另一桌上菜吧,其他桌子可以先上一盘菜让等待的顾客填填肚子。当用户点击下一页的时候再调度下一个B的url。jj有说,那为了保持每次访问的稳定性,就是结果相同,如果遇到这种情况:第一个user查询一个关键词,从第一个B中获取了url,那这时如果第二个user也输入同一个关键字,为了保证结果相同,必须要调用相同的B模块吧,那么有多个用户呢?这样第一个B模块的负担会很重啊,这个问题怎么解决?我回答说,可以在A中构造一个cache,这样就可以由A模块自己解决同样的关键字搜索了,jj说是一种解决方案,还有没有其他的?我说能不能将B模块指向其他模块的的数据库啊,她说那样的结构会很复杂,不予采纳。然后我说难道要每个B都访问同样的海量url数据库?她没给肯定的回答,也没否定,说让我按这个思路往下走,如果B都访问相同的数据库,那就肯定能保证相同的结果了,那应该怎么由A调度B,我说对每个B设置一个状态指示参数就可以了,调用空闲状态的B。然后我自己补充道,如果然B去访问海量数据库的话,其实还可以让B自身做一个Cache这样就不用为每个query去海量搜索了,jj说这个方法也行,但是不觉得为每个B设置cache很浪费吗?我说那就开辟共享内存吧,每个B都可以读取这个cache中的信息,不过要考虑写入时的进程互斥性吧。jj说这个可以~~
我低头想了一会,然后很快在纸上列出了提纲大致是海量用户和海量数据的针对性解决方案。海量用户吧,不同用户在大时间范围内应该是有并发和先后执行顺序的,在程序执行的小时间片上肯定是先后顺序的。我首先设计了一个消息队列来存放用户的query,(她听到信息队列,点头说对),然后肯定要多线程处理不同用户的请求(她点头),
然后接着说,处理海量数据,可以将海量数据分布式处理,分别交由n个B模块来处理。这时她问怎么分布这些Url,平均或是聚集?我说数量上应该平均,最好是用hash映射一下。她说那你要A怎么调度B模块呢?一个一个还是n个同时运作。我说,一个网页一次能显示的url是有限的,n个B同时返回所有Url还要将没有被显示的存储在A的内存中,这样多个用户请求就要开辟多个存储多余Url的空间,对于海量User相当困难吧,所以我觉得应该一个一个调度,先用一个B的url来满足用户需求,就像去一个很多顾客的餐馆吃饭,总不能把一桌的餐全上齐了再给另一桌上菜吧,其他桌子可以先上一盘菜让等待的顾客填填肚子。当用户点击下一页的时候再调度下一个B的url。jj有说,那为了保持每次访问的稳定性,就是结果相同,如果遇到这种情况:第一个user查询一个关键词,从第一个B中获取了url,那这时如果第二个user也输入同一个关键字,为了保证结果相同,必须要调用相同的B模块吧,那么有多个用户呢?这样第一个B模块的负担会很重啊,这个问题怎么解决?我回答说,可以在A中构造一个cache,这样就可以由A模块自己解决同样的关键字搜索了,jj说是一种解决方案,还有没有其他的?我说能不能将B模块指向其他模块的的数据库啊,她说那样的结构会很复杂,不予采纳。然后我说难道要每个B都访问同样的海量url数据库?她没给肯定的回答,也没否定,说让我按这个思路往下走,如果B都访问相同的数据库,那就肯定能保证相同的结果了,那应该怎么由A调度B,我说对每个B设置一个状态指示参数就可以了,调用空闲状态的B。然后我自己补充道,如果然B去访问海量数据库的话,其实还可以让B自身做一个Cache这样就不用为每个query去海量搜索了,jj说这个方法也行,但是不觉得为每个B设置cache很浪费吗?我说那就开辟共享内存吧,每个B都可以读取这个cache中的信息,不过要考虑写入时的进程互斥性吧。jj说这个可以~~
jj肯定这个想法,但似乎总是对我的设计有些疑问似的,可能没有答到她的点上吧,然后对我的系统总结了一下说,功能和想法上是正确的,也有针对性,但是实际系统这样实现起来肯定有问题的,不过人都是这样的,要解决问题总是跟着第一思路走,然后第一思路遇到问题,想办法解决,然后系统都越来越复杂什么之类.....然后我说是啊,这只是初步想法,设计后肯定要优化的啊,然后她又补充了一下,问我如果实习的话能保证多长时间,我说6个月没问题(我觉得问我这个问题一般是意味着我已经过了吧)。然后她问我有什么要问的之类的,我问了上海百度和北京总部的职能区别之类的东西。
zaizi : yuxiaoting