Tiny URL design

常見誤區:

  • 流量一定巨大無比
  • 流量大所以要用 NoSQL
  • 一定要用 distributed system => 都需要經過思考&討論!

4S 分析

Scenario:

  1. 長網址轉短網址
  2. 短網址查找長網址

Storage: 以 DAU = 100M 來看,假設每人有 0.1 個 (1) 需求,則流量為 100M * 0.1/86400 約 120 (average), peak 250。 (2) 的需求較多,假設為每個人都用,則 100M/86400 約為 1K, peak 2K, 那麼 cache + SQL 的設計可能就很足夠

硬碟的話, 平均來說,一條 100 bytes,則 100M * 0.1 * 100 約為 1G,那三年約用 1T


SQL ro NoSQL ?

  • 複雜 query?
  • transanction?
  • Scalibility?
  • 長到短網址的算法需求?

算法可用

  1. 隨機產生,再去搜尋是否有重複 (很實用!)
  2. Base62 生成 => 依賴 Sequential ID, SQL 在多台機器情況下很難去維持唯一的 id, 所以用 Base62 會有這個問題

Base62:

// base62 code

若基於 random, 則需要存一張 short, long 表,short、long 都要建立 index,才能互相查找對方。

若用 NoSQL,則需要兩張表,因為 NoSQL 一般不支持 multi-index


基於進制轉換的做法只能使用 SQL,因為要有全局不變的那個 id,

不過變成只要存 id 和長網址即可,因為短網址可以用 ID 算出來 =>

id longURL (index = true)

Optimization:

短網址是一個讀多寫少的系統,馬上想到可以用 cache 優化,這邊為"資料讀取優化"

另一方面是"服務器訪問優化“,可以根據地理位置來優化:

部屬多台機器到不同地區,請求經過 DNS 解析後,根據 IP 發送到最近的服務器

而 server 間的訪問是可以優化的,經由 router,client <-> server 卻是比較難優化

(寧願台灣server訪問美國 server 也不要台灣 user 訪問美國 server)


最後是一些想法:

  • S -> L 一定是一對一
  • L -> S 可以一對多,多個又何妨?
  • (S, L), (L, S) 都存也可以,全看需求
  • 主要是不要廣播詢問,鐵定很慢

results matching ""

    No results matching ""