系统设计面试题 - 为搜索引擎设计一个 key-value 储存

引用:
系统设计入门

为搜索引擎设计一个 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个查询请求都是不同的,并且都需要存储在缓存中)。

第二步:高层次设计

系统设计面试题 - 为搜索引擎设计一个 key-value 储存_第1张图片
为搜索引擎设计一个 key-value 储存

第三步:设计核心组件

提供一个REST 形式的Query API:

  • 解析输入字符串:
    • 去除标记 markup
    • 分词
    • Fix 输入错误 typo
    • 规范化大小写
  • 查询 Memory Cache 是否缓存了对应的query
    • 如果有,将这条目放置到LRU的前端,返回结果
    • 如果没有:
      • 通过 Reverse Index Service 查询该query对应的文档(根据相关性排序,并访问靠前的文档)
      • 通过 Document Service 查询每一个文档的标题及摘要
      • 将这一新的条目放置到LRU的前端,返回结果

可以给缓存中的每一个条目设置一个TTL,来定期进行更新。

第四步:扩展设计

系统设计面试题 - 为搜索引擎设计一个 key-value 储存_第2张图片
为搜索引擎设计一个 key-value 储存
  • 为了同时响应更多请求,对服务器水平扩展,并使用Load Balancer做负载均衡。

你可能感兴趣的:(系统设计面试题 - 为搜索引擎设计一个 key-value 储存)