短網址系統設計


Posted by rockyooooooo on 2021-07-01

請你畫出一張短網址服務的後端系統架構圖,越詳細越好,可以考慮到如何增進效能、scaling 以及備份資料。

短網址

什麼是短網址

一般的網址常會很長很複雜,在分享網址時會佔太大的篇幅,或是影響美觀,可以利用短網址服務來讓網址縮短。

就像這個頁面的網址:

https://rockyooooooo.coderbridge.io/2021/07/01/shorten-url-service-design/

縮完之後會變這樣:

https://ppt.cc/fHbXUx

網址幾乎只有原本的三分之一,如果原本的網址更長的話,效果會更明顯,像是有些含有中文的網址,因為編碼關係,中文可能會變成一大串特殊符號,這樣在分享網址時就特別適合用短網址。

基本原理

其實短網址並不是真的把原本的網址縮短了,原本的網址還是可以用,而是伺服器會根據演算法,產生一個較短且獨一無二的網址,並存到資料庫,當使用者輸入這個短網址,伺服器會去資料庫找這個短網址對應的是哪一個網址,然後幫使用者轉址到正確的頁面。

系統架構

產生短網址

使用者輸入一串網址,伺服器要回傳一串獨一無二且無法預測的短網址。

basic

單點故障(Single Point Of Failure)

目前的設計,如果其中一個 Server 或是 Database 掛了,我們的短網址服務就無法使用了,所以 Server 跟 Database 都不能只有一個。再加上 Load Balancer 來進行分流,Load Balancer 當然也不能只有一個。

SPOF

短網址還原

我們再加上還原短網址的流程,用淺藍色的線條來表示。

retrieve

  1. 使用者在網址列輸入:https://ppt.cc/fHbXUx
  2. 伺服器向資料庫詢問這串短網址的原網址,得到:https://rockyooooooo.coderbridge.io/2021/07/01/shorten-url-service-design/
  3. 幫使用者轉址到原網址

Cache

我們可以將使用者用過的短網址先存在 Cache 裡,下次使用者輸入短網址時,就可以從 Cache 裡找到原網址,有找到就不用到資料庫找了,提升效率。

cache

  1. 使用者在網址列輸入:https://ppt.cc/fHbXUx
  2. 伺服器到 Cache 找這串短網址的原網址
    • 找到原網址
      1. 得到:https://rockyooooooo.coderbridge.io/2021/07/01/shorten-url-service-design/
      2. 幫使用者轉址到原網址
        • 找不到原網址
      3. 伺服器到資料庫找這串短網址的原網址
        • 找到原網址
          1. 得到:https://rockyooooooo.coderbridge.io/2021/07/01/shorten-url-service-design/
          2. 幫使用者轉址到原網址
            • 找不到原網址 - 回傳 HTTP 404 給使用者

其他改善方向

Key Generations Service

預先產生一些隨機且唯一的 Key,存到專門存放這些 Key 的資料庫(Key-DB),每當需要產生新的短網址時,只要從這個資料庫拿取後加上就好了,不但可以加快速度,也可以保證短網址不重複。

資料庫複寫(Replication)與讀寫分離

其中一個資料庫當作 Master,剩下的當作 Slaves,任何需要變動到資料庫裡的資料都在 Master 完成,再同步到每個 Slaves,而 Slaves 就只要負責讀取資料的工作就好。

刪除過期短網址

如果不斷的檢查過期的短網址來清除他們,會給伺服器很大的負擔。

我們可以設定短網址的過期時間,如果使用者要訪問一個過期的短網址,就回傳給他 HTTP 404,並刪除該短網址。也可以每隔一段時間就清除那些過期的短網址,當然要在流量比較低的時候才做這件事。

短網址被刪除後,要把該短網址的 Key 釋放,讓 Key-DB 可以再次使用這些 Keys。

參考資料

tags: Lidemy-MTR05, Week14









Related Posts

每日心得筆記 2020-06-19(五)

每日心得筆記 2020-06-19(五)

〈 C++學習日記 #2〉再談指標 Pointer (Part.2)

〈 C++學習日記 #2〉再談指標 Pointer (Part.2)

Day04 你知道 setTimout、setInterval、requestAnimationFrame API 三者的關係嗎

Day04 你知道 setTimout、setInterval、requestAnimationFrame API 三者的關係嗎


Comments