系統(tǒng)設(shè)計面試題 - 為搜索引擎設(shè)計一個 key-value 儲存

引用:
系統(tǒng)設(shè)計入門

為搜索引擎設(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ù)載均衡。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容