高擴展性網站的50條原則


《高擴展性網站的50條原則》,利用一天半的時間快速瀏覽總結的電子書,對網站的建設有一個原則性的把握,書中提到的大部分原則現在已成為互聯網行業的共識,但並不妨礙我們重新整理分類,從全局層面把控高擴展性網站的建設思路,文中的每一條盡管高度凝練,但都值得細細品味。完成於2015年6月11日11:02:19。
(一)化簡方程
  1. 不要過度設計:基於成本的考慮,只設計能滿足要求的系統即可,過於理想化的設計不利於系統的維護與成本控制;
  2. 設計時考慮擴展性:設計20倍的容量,實現3倍的容量,部署1.5倍的容量,即所謂的D-I-D方法;
  3. 在設計復雜系統時將方案的設計、范圍和實施一簡再簡,在精簡過程中可以參考2-8原則,優先最主要,最核心的實現;
  4. 減少頁面的DNS查找:
  5. 通過減少與合並等機制,盡可能減少頁面上的對象,降低請求資源的次數;
  6. 使用同一品牌的網絡設備,減少不同品牌的網絡設備間帶來的擴展性問題;
總結:
(二)分布工作
  1. 橫向復制:復制服務或數據庫來分散事務負載,X軸原則;
  2. 縱向拆分:根據動詞或名詞,拆分服務和數據
  3. 拆分相近的東西:利用某些主題的屬性進行查分,如利用客戶的ID、所在地等進行拆分;
總結:
(三)橫向擴展設計
  1. 設計橫向擴展方案;
  2. 采用經濟型系統,包括服務器及其他硬件,節約成本;
  3. 橫向擴展數據中心:設計具有三個或更多實時數據中心的系統,分散數據,分散事務負載;
  4. 利用雲計算進行設計,面對突發的擴展,利用自建或第三方的雲技術可以幫助快速環境准備;
總結:
(四)使用正確的工具
  1. 合理選擇數據存儲:尤其是對於RDBMS的選擇,看是否有事務要求,如果只是簡單存儲,考慮文件系統或緩存等;
  2. 謹慎使用防火牆;
  3. 利用監控工具收集並分析系統日志文件
總結:

(五)不要重復工作
  1. 不要立即檢查剛做過的工作,即不要立即讀剛寫入大數據,因為這種寫出錯的概率微乎其微;
  2. 避免使用重定向,如果必須使用,優先考慮服務器配置;
  3. 放松時序約束,數據的分布總會給狀態帶來短暫的不一致,強行約束時序會使系統處理緩慢;
總結:

(六)積極利用緩存
  1. 大用戶流程使用CDN;
  2. 使用HTTP頭中的Expires、Cache-Control、Last-Modified等過期設置,包括對Web服務器對應HTTP頭信息的設置;
  3. 緩存Ajax調用;
  4. 應用頁面緩存,在web服務器前加上頁面靜態內容緩存;
  5. 應用緩存使用;
  6. 在數據庫和應用層之間加入對象緩存,如memcached;
  7. 將對象緩存獨立成單獨的層為上層提供服務;
總結:
(七)從錯誤中吸取教訓
  1. 從偶爾錯誤事件及失敗中總結學習;
  2. 不要依靠QA發現錯誤,更多的從控制編程角度控制;
  3. 沒有回退共的設計是失敗的設計;
  4. 討論失敗並從中吸取教訓;
總結:
(八)數據庫原則
  1. 在設計數據模型時,考慮實體間較復雜的關系,為將來的數據庫分割或其他處理做好准備;
  2. 使用類型正確的數據庫鎖,如隱式鎖、顯式鎖、行鎖、頁鎖、范圍鎖、表鎖、數據庫鎖;
  3. 不要使用多階段提交協議處理存儲或事務,因為其是阻斷性提議,對數據庫的鎖定要求更強;
  4. 避免使用select for update ,因為該語句查詢到的行都會被鎖住;
  5. 不要使用select * 選擇所有數據列,使用select或insert的時候都制定列名;
總結:
(九)容錯設計與故障設計
  1. 采用隔離故障的泳道,通過將服務拆分或將大數據量的表按屬性划分進行隔離,減少隔離域之間的同步調用及數據共享;
  2. 避免單點故障,采用master/master的模式,通過負載均衡器均衡跨服務的流量;
  3. 避免系統串聯,如果要串聯,也要將單個系統和核心環節的系統設置成集群模式;
  4. 對於有風險或共享的服務,需要創建一種結果做到啟用或禁用(可通過配置文件、數據庫、啟動參數、同步命令、文件標記等方式)
總結:
(十)避免狀態或分發狀態
  1. 避免狀態:努力實現無狀態,通過合理的設計選擇;
  2. 分發狀態:盡量在瀏覽器端維護會話,保持在cookie中;
  3. 分發狀態:利用分布式緩存存放狀態,通過緩存數據提高存取速度,需要考慮支持持久化的緩存服務選擇或利用數據庫進行持久化
總結:
(十一)異步通信和消息總線
  1. 盡可能使用異步通信保證每個服務和層都是獨立的,即使一定要用同步服務,需要設置服務超時時間;使用異步通訊的常見四種情況:(調用外部API或第三方方法;調用長時間運行的進程;調用容易出錯和頻繁更改的方法;調用無時間約束或業務連續性約束的系統或服務);
  2. 確保消息總線能夠擴展:通過服務按不同類型或不同處理方式進行拆分;
  3. 避免讓消息總線過於擁擠,不要發布所有消息,減少低價值高成本的流程,對低價值/低成本和高價值/高成本的流量進行采樣;
總結:
(十二)其他原則
  1. 慎用第三方解決方案擴展;
  2. 從成本角度合理使用存儲,對於不同價值的數據采用不同的存儲策略;
  3. 刪除數據庫事務處理過程中的業務邏輯處理,讓數據庫只做數據事務處理方面的共走,與業務邏輯無相關;
  4. 設計能夠監控的應用,在設計階段就要考慮監控,做到從業務的角度監控而不僅僅是CPU、內存、網絡等純技術監控;
  5. 團隊中的技術能力要能勝任對系統、組件、服務等相關能力的需要,做到自助可控;
總結:
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM