墨菲定律:
- 任何事情都沒有表面看起來那麼簡單
- 所有的事情都會比你預計的時間長
- 可能出錯的事總會出錯
- 如果你擔心某種情況發生,那麼他就更有可能發生
高併發原則
無狀態
如果設計的應用是無狀態的,那麼應用比較容易進行水平擴展。
拆分
根據具體情況權衡,是設計一個大而全的系統還是按功能模塊拆分系統。
服務化
進程內服務->單機遠程服務->集羣手動註冊服務->自動註冊和發現服務->服務的分組、隔離、路由->服務治理如限流、黑白名單
消息隊列
數據異構
- 數據異構
- 數據閉環
緩存銀彈
緩存對於讀服務來說可謂抗流量的銀彈。
- 瀏覽器端緩存:適用於對實時性不太敏感的數據
- APP客戶端緩存:素材提前下發到客戶端緩存;離線地圖
- CDN緩存:一種是推送機制(當內容變更後主動推送到CDN邊緣節點),一種是拉取機制(先訪問邊緣節點,當沒有內容時,回源到服務器拿到內容並存儲到節點上)。URL中不能 有隨機數
- 接入層緩存:url重寫,一致性哈希,proxy_cache,proxy_cache_lock,shared_dict
- 應用層緩存
- 分佈式緩存
併發化
高可用原則
降級
限流
主要目的是防止惡意請求流量、惡意攻擊,或者防止流量超出系統峯值。
- 惡意請求流量只訪問到cache
- 對於穿透到後端的流量可以考慮使用Nginx的limit模塊處理
- 對於惡意IP可以使用nginx deny進行屏蔽
原則是限制流量穿透到後端薄弱的應用層
切流量
對於一個大型應用,切流量是非常重要的,比如多機房環境下某個機房掛了,或者某個機架掛了,或則某臺服務器掛了,都需要切流量。
- DNS:切換機放入口
- HttpDNS:主要APP場景下,在客戶端分配好流量入口
- LVS/HaProxy:切換故障的nginx接入層
- Nginx:切換故障的應用層
可回滾
業務設計原則
防重設計
考慮重複提交,防止重複扣減庫存等
冪等設計
流程可定義
狀態與狀態機
後臺系統操作可反饋
後臺系統審批化
操作可追溯、可審計
文檔和註釋
系統發展的一開始就有文檔庫(設計架構、設計思想、數據字典/業務流程、現有問題),業務代碼和特殊需求都要有註釋。