為搜索引擎設(shè)計(jì)一個(gè) key-value 儲(chǔ)存
第一步:通過(guò)討論蝇率,明確限制及用例本缠,確定Scope
支持的用例:
- 用戶發(fā)送一個(gè)查詢請(qǐng)求:
- 若存在胰柑,返回對(duì)應(yīng)的value
- 若不存在卡睦,返回miss
- 系統(tǒng)高可用 high availability
不支持的用例:
- 無(wú)
Constraints and assumptions:
- 訪問(wèn)不均勻
- 需要快速響應(yīng)
- 10 million 個(gè)用戶
- 每月10 billion個(gè)查詢請(qǐng)求器仗,每秒4,000次融涣。
計(jì)算規(guī)模:
對(duì)每一條緩存:
- query:50 bytes
- title:20 bytes
- snippet:200 bytes
- 總共:270 bytes
每個(gè)月:270 bytes * 10 billion = 2.7 TB(假設(shè)每月10 billion個(gè)查詢請(qǐng)求都是不同的,并且都需要存儲(chǔ)在緩存中)精钮。
第二步:高層次設(shè)計(jì)
為搜索引擎設(shè)計(jì)一個(gè) key-value 儲(chǔ)存
第三步:設(shè)計(jì)核心組件
提供一個(gè)REST 形式的Query API:
- 解析輸入字符串:
- 去除標(biāo)記 markup
- 分詞
- Fix 輸入錯(cuò)誤 typo
- 規(guī)范化大小寫
- 查詢 Memory Cache 是否緩存了對(duì)應(yīng)的query
- 如果有威鹿,將這條目放置到LRU的前端,返回結(jié)果
- 如果沒(méi)有:
- 通過(guò) Reverse Index Service 查詢?cè)搎uery對(duì)應(yīng)的文檔(根據(jù)相關(guān)性排序轨香,并訪問(wèn)靠前的文檔)
- 通過(guò) Document Service 查詢每一個(gè)文檔的標(biāo)題及摘要
- 將這一新的條目放置到LRU的前端忽你,返回結(jié)果
可以給緩存中的每一個(gè)條目設(shè)置一個(gè)TTL,來(lái)定期進(jìn)行更新臂容。
第四步:擴(kuò)展設(shè)計(jì)
為搜索引擎設(shè)計(jì)一個(gè) key-value 儲(chǔ)存
- 為了同時(shí)響應(yīng)更多請(qǐng)求科雳,對(duì)服務(wù)器水平擴(kuò)展,并使用Load Balancer做負(fù)載均衡脓杉。