? 之前在面試頭條后端開發(fā)崗位,碰到了一個開放型問題:設計一個短域名系統(tǒng)。leetcode有該方案的討論,側重于算法實現(xiàn),本文主要討論整體網(wǎng)站設計。
? 由于是開發(fā)性試題,一般是不提示,不限制,因此清晰的思路尤為重要。對于系統(tǒng)設計,個人工作經(jīng)驗總結是,抓住數(shù)據(jù)流向這條線來解答。一般分為數(shù)據(jù)源(數(shù)據(jù)怎么來,規(guī)模多大),數(shù)據(jù)處理邏輯(數(shù)據(jù)進入系統(tǒng)如何處理),數(shù)據(jù)存儲方案等三步來設計。
-
a. 數(shù)據(jù)源
- 就本題,數(shù)據(jù)通過接口調(diào)用進入后端系統(tǒng),域名數(shù)據(jù)量很大,比較分散,系統(tǒng)QPS大時需要通過 DNS輪詢 -> LVS集群 -> Nginx -> 后端服務。
-
b. 數(shù)據(jù)處理
- 長域名 -> 短域名,短域名 -> 長域名。長 -> 短,采用Hash進行映射(需要解決Hash沖突問題)。 短 -> 長,由于Hash不可逆,所以需要用數(shù)據(jù)庫存儲映射關系。
-
c. 數(shù)據(jù)存儲
- 由于數(shù)據(jù)量大,查詢?yōu)橹鳎钥梢杂胢ongo集群存儲。
-
d. 其它
- 系統(tǒng)設計通用設計,包括權限分配,日志監(jiān)控,代碼規(guī)范,模塊解耦等。