為搜索引擎設(shè)計一個 key-value 儲存
第一步:通過討論,明確限制及用例,確定Scope
支持的用例:
- 用戶發(fā)送一個查詢請求:
- 若存在,返回對應(yīng)的value
- 若不存在,返回miss
- 系統(tǒng)高可用 high availability
不支持的用例:
- 無
Constraints and assumptions:
- 訪問不均勻
- 需要快速響應(yīng)
- 10 million 個用戶
- 每月10 billion個查詢請求,每秒4,000次。
計算規(guī)模:
對每一條緩存:
- query:50 bytes
- title:20 bytes
- snippet:200 bytes
- 總共:270 bytes
每個月:270 bytes * 10 billion = 2.7 TB(假設(shè)每月10 billion個查詢請求都是不同的,并且都需要存儲在緩存中)。
第二步:高層次設(shè)計
為搜索引擎設(shè)計一個 key-value 儲存
第三步:設(shè)計核心組件
提供一個REST 形式的Query API:
- 解析輸入字符串:
- 去除標(biāo)記 markup
- 分詞
- Fix 輸入錯誤 typo
- 規(guī)范化大小寫
- 查詢 Memory Cache 是否緩存了對應(yīng)的query
- 如果有,將這條目放置到LRU的前端,返回結(jié)果
- 如果沒有:
- 通過 Reverse Index Service 查詢該query對應(yīng)的文檔(根據(jù)相關(guān)性排序,并訪問靠前的文檔)
- 通過 Document Service 查詢每一個文檔的標(biāo)題及摘要
- 將這一新的條目放置到LRU的前端,返回結(jié)果
可以給緩存中的每一個條目設(shè)置一個TTL,來定期進(jìn)行更新。
第四步:擴(kuò)展設(shè)計

為搜索引擎設(shè)計一個 key-value 儲存
- 為了同時響應(yīng)更多請求,對服務(wù)器水平擴(kuò)展,并使用Load Balancer做負(fù)載均衡。