引用:
系统设计入门
为搜索引擎设计一个 key-value 储存
第一步:通过讨论,明确限制及用例,确定Scope
支持的用例:
- 用户发送一个查询请求:
- 若存在,返回对应的value
- 若不存在,返回miss
- 系统高可用 high availability
不支持的用例:
- 无
Constraints and assumptions:
- 访问不均匀
- 需要快速响应
- 10 million 个用户
- 每月10 billion个查询请求,每秒4,000次。
计算规模:
对每一条缓存:
- query:50 bytes
- title:20 bytes
- snippet:200 bytes
- 总共:270 bytes
每个月:270 bytes * 10 billion = 2.7 TB(假设每月10 billion个查询请求都是不同的,并且都需要存储在缓存中)。
第二步:高层次设计
第三步:设计核心组件
提供一个REST 形式的Query API:
- 解析输入字符串:
- 去除标记 markup
- 分词
- Fix 输入错误 typo
- 规范化大小写
- 查询 Memory Cache 是否缓存了对应的query
- 如果有,将这条目放置到LRU的前端,返回结果
- 如果没有:
- 通过 Reverse Index Service 查询该query对应的文档(根据相关性排序,并访问靠前的文档)
- 通过 Document Service 查询每一个文档的标题及摘要
- 将这一新的条目放置到LRU的前端,返回结果
可以给缓存中的每一个条目设置一个TTL,来定期进行更新。
第四步:扩展设计
- 为了同时响应更多请求,对服务器水平扩展,并使用Load Balancer做负载均衡。