天天看點

Nginx專欄—什麼是好設計

前言

剛入職的時候,我覺得最大的挑戰不是公司五花八門的技術名詞,或者寫代碼,而是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指極高的可用性。      
Nginx專欄—什麼是好設計

故障級别:

一級故障:網站整體不可用

二級故障:網站通路不順暢,核心功能不可用

三級故障:核心功能少數使用者不可用

四級或以上故障

可用性的優化:

1. 負載均衡

2. 資料庫的主從模式和主主模式

3. 限流

4. 日志

5. 監控和警報

開會靈魂五問:

負載均衡(load balancer)用了嗎?

會不會出現單點故障(Single point of failure) ?

資料庫怎麼複制?(主從,主主)

高并發怎麼辦?限流(Rate limiter)了嗎?

如何寫日志,做監控,發警報?

安全的設計

安全類的話題專業性比較強,一般需要專業的安全行業知識,我這裡隻淺顯地跟大家列舉三種安全類問題。

  1. 網絡攻擊

常見的防護手段是在代碼中加強請求消息的過濾和SQL參數綁定,以及加驗證子產品和防火牆。

  1. 資訊加密

常見的加密方法有one way hashing,對稱或者非對稱加密。

  1. 資訊過濾和反垃圾

常用的技術手段是貝葉斯分類算法和布隆過濾器。大家可以看我的第四講專題講解布隆過濾器。

開會靈魂三問:

敏感資料加密了嗎?

有驗證子產品嗎?

服務之間是SSL/TLS嗎?