前言
剛入職的時候,我覺得最大的挑戰不是公司五花八門的技術名詞,或者寫代碼,而是design。因為code是可以學習的,各種名詞縮寫公司也會給你時間去适應,但是系統設計,如果沒有真實的生産經驗,無論說什麼,其實都是紙上談兵。
其實作為新人入職,公司也不會讓你馬上就去架構一個系統,但是作為組裡的一員,一定會參與到各種各樣的設計讨論和會議中。而當參加這種讨論的時候,你知道怎麼去提出質疑嗎?怎麼樣和對方argue嗎?如果想盡快升職,盡快可以自己獨立開發項目,這種會議,從剛入職開始,就不要一言不發,什麼都說不上來。今天的内容就是幫助你解決這個問題。
解決這個問題,我們首先要知道什麼是一個好的設計。我的回答就是:
一個好的設計,一定是高性能,高可用,和安全的。
性能的四個名額
響應時間:指應用系統從送出請求開始,到收到最後響應資料所需要的時間。響應時間是系統最重要的性能名額,最直接地反映了系統的快慢。
并發數:指系統同時處理的請求數,這個數字反映了系統的負載特性。比如對于一個網際網路應用來說,并發數就是同時送出請求的使用者數目。
吞吐量:指機關時間内系統處理請求的數量,展現的是系統的處理能力。我們一般用TPS 是每秒事務數,或者 QPS,每秒的查詢數來表示。吞吐量、響應時間和并發數這三個名額之間是有關聯性的,響應時間越快,并發數越大,吞吐量也就越高。
系統名額:伺服器或者作業系統性能的一些名額資料,比如記憶體和CPU的使用情況、磁盤和網絡 I/O 等等。在程式部署之後,監控系統去監控這些系統名額,一旦資源使用率超過我們設定的最大額度的時候,就會發出警報。
有關性能的問題:
1預計負載多少?最大承載壓力多少?
2TPS/QPS是多少?響應時間是多少?
3需要多少CPU/Memory才能達到預期性能?
建設性意見:
1緩存:通過緩存可以減少資料庫的負載壓力。
2叢集:通過負載均衡的手段,将多種應用伺服器建構成一個叢集,共同提供服務,以提高系統整體的處理能力。
3消息隊列:可以使系統不同應用和服務之間異步調用,不僅可以使請求發起方盡快的拿到響應,還有如果某個時段通路量特别高,可以相當于一個buffer,避免對系統過高的負載壓力。
高可用的設計
可用性的名額業界常用幾個9來表示。
下面是我在wikipedia上複制過來的表格。一般來說,2個9表示系統基本可用,3個9是較高可用,4個9 就可以算是高可用,5個9指極高的可用性。

故障級别:
一級故障:網站整體不可用
二級故障:網站通路不順暢,核心功能不可用
三級故障:核心功能少數使用者不可用
四級或以上故障
可用性的優化:
1. 負載均衡
2. 資料庫的主從模式和主主模式
3. 限流
4. 日志
5. 監控和警報
開會靈魂五問:
負載均衡(load balancer)用了嗎?
會不會出現單點故障(Single point of failure) ?
資料庫怎麼複制?(主從,主主)
高并發怎麼辦?限流(Rate limiter)了嗎?
如何寫日志,做監控,發警報?
安全的設計
安全類的話題專業性比較強,一般需要專業的安全行業知識,我這裡隻淺顯地跟大家列舉三種安全類問題。
- 網絡攻擊
常見的防護手段是在代碼中加強請求消息的過濾和SQL參數綁定,以及加驗證子產品和防火牆。
- 資訊加密
常見的加密方法有one way hashing,對稱或者非對稱加密。
- 資訊過濾和反垃圾
常用的技術手段是貝葉斯分類算法和布隆過濾器。大家可以看我的第四講專題講解布隆過濾器。
開會靈魂三問:
敏感資料加密了嗎?
有驗證子產品嗎?
服務之間是SSL/TLS嗎?