Q1.假设你正在搭建某种服务,有多达1000个客户端软件会调用该服务,取得每天盘后股票价格信息。假设你手里已有这些数据,存储格式可自行定义。你会如何设计这套面向客户端的服务,向客户端软件提供信息?你将负责该服务的研发、部署、持续监控和维护。描述你想到的各种实现方案,以及如何推荐采用你的方案。该服务的实现技术可任选,此外,可以选用任何机制向客户端分发信息。
Ans.思路:
- 方案1.将数据存放在纯文本中,让客户的通过FTP服务器下载。
- 方案2.使用SQL数据库
- 方案3.XML
- 无论提供那种数据存储方案,都可以提供Web服务(比如SOAP)供客户端存取数据。
Q2.如果要设计一个网络爬虫程序,该怎么避免陷入无限循环?
Ans.思路:
- 什么时候会出现无限循环? 网络链接图中有环。
- 可以使用散列表保存是否访问过某页面,并使用广度优先搜索方式抓取网站。
- 怎样定义不同页面?基于URL还是页面内容?
一种解决方法是评估相似程度,根据内容和URL
Q3.想象有个Web服务器,实现简化版搜索引擎。这套系统有100台机器来响应搜索查询,可能会对另外的机器集群调用processSearch(string query)以得到真正的结果。响应查询请求的机器是随机挑选的,因此两个同样的请求不一定由同一台机器响应。方法processSearch的开销很大,请设计一种缓存机制,缓存最近几次查询的结果。当数据发生变化时,务必说明该如何更新缓存。
Ans.思路:
- 前提假设:
除了必要时外调,所有查询都在最初那台机器上完成。
缓存的搜索查询数量庞大(几百万)。
机器之间的调用速度相对较快。
给定查询的结果是一个有序的网址列表,每个网址关联50个字符的标题和200个字符的摘要。
最常见的查询非常热门,以至于它们总是存在缓存中。 - 系统需求
给定某个键,能快速有效地查找出来
旧的数据会过期,从而让它可被新的数据取代 - step1.设计单系统的缓存
使用链表可以轻易清楚旧数据,将新数据移到链表前方,当链表超过一定大小时,删除末尾数据。
散列表可以高效查找数据,通常无法轻易清除数据。
可以将链表和散列表结合起来。Java中的LinkedHashMap。 - step2.扩展到多态机器
需要决定缓存跨机共享到什么程度?
1)每台机器都有自己的缓存。许多重复查询会被视为全新查询。
2)每台机器都有一个缓存的副本。需要更新N台机器
3)每台机器存储一部分缓存。
一种选择是hash(query)%N查询有缓存的机器,跨机外调该指定的机器。 - step3.内容改变时更新结果
结果改变时机:
1)网址对应内容变了,或者移除了
2)页面排名变化
3)特定查询出现了新页面(自动逾期:超过一定时间自动刷新) - step4.继续改进
1)机器i外调机器j后,可以在机器i本地缓存结果
2)架构更改,按照散列值分配给某台机器而不是随机分配
3)可以根据主题或网址实现不同的自动逾期机制