高性能web系統的架構和系統優化


高性能web系統的架構和系統優化

 07年畢業一直都在軟件公司,14年來到一個互聯網公司,給我的感受,區別主要在於:

     軟件公司需求相對穩定,能夠按照計划按部就班的去實施,互聯網公司需求相對來說不穩定,上線比較着急,大部分都是小迭代更新,且更新頻繁,感覺有點亂。所以項目管理在軟件公司比較好執行,一開始可能有點混亂,但是只要是走上一兩個迭代,就可以穩定的往前走,在互聯網公司應用比較困難。美其名曰敏捷開發,就是為了給自己找一個不穩定的借口。

     目前的公司是一家電商公司,在互聯網如火如荼的雙11也能體驗一把,在增加訂單量的同時,也給軟件帶來了更大的挑戰,軟件架構就像一個人的心臟,汽車的發動機,如果系統的架構出了問題,這筆債遲早是要還的,08年奧運會搶票系統,聚美優品等在高並發的情況下都出現過宕機的情況,后來都對架構進行了改進。

說到軟件架構,可能每個人都有不同的理解,但大致上分為兩類:

  • 組成派

軟件系統的架構將系統描述為計算組件及組件之間的交互。

計算組件是泛指的,可以進一步細分為處理組件,數據組件,連接組件可以是子系統,框架,模塊,類等不同粒度的軟件單元

  • 協作派

軟件架構包含了關於一下問題的重要決策,對關鍵問題進行決策。

軟件架構並不僅僅注重軟件本身的結構和行為,還組中其他特性,使用,功能性,性能,彈性,重用,可理解性,經濟和技術的限制的權衡。

下面我將從以下幾個方面來談一下如何建立高性能的web系統:

一、web系統架構

web系統架構圖:

二、web系統優化

1、 網站前端的優化

  • 建立web 集群

      反向代理服務器工作在HTTP層,類似代理服務器,與普通的代理服務器不同的是,服務器在代理的后端,而不是客戶端在代理的后端,可以考慮使用 eginx做反向代理服務器實現 web 服務器的負載均衡。

 

  • Css放到head 之間,js放到頁面的最下面。

      因為頁面的加載是從上往下的順序執行的,js文件在加載的時候會阻塞頁面的執行,所以放到頁面最下面可以先看到頁面的內容,再去加載相應的js文件。

  • Css和js文件要合並和壓縮。

     因為瀏覽器的連接數是有限的,如果css 和 js 文件過多會導致瀏覽器的延遲等待。

  • 使用獨立的圖片服務器和網站域名。

     可以提高網站的並發能力。

  • 網站的頻道用獨立的二級域名。
  • 多個小圖標可以考慮放到一個大圖片上,然后用css 定位取到相應的內容
  • CDN 內容分發

     對於像js,css,image, html  等靜態內容可以做內容分發,可以把用戶定位到最近的服務器上面。

  • 減小cookie 的大小

     因為頁面每一個的回傳都會把cookie文件提交過去,如果cookie 過大會浪費過多的網絡資源。

  • 網站動靜文件分離

     把靜態文件放到一個獨立的服務器上,可以考慮用eginx web服務器,eginx 靜態文件的處理速度非常快,不是iis 所能比的。

  • 頁面內容進行壓縮

     頁面內容要進行壓縮,較少網絡傳輸的壓力,可以考慮用Gzip壓縮。

  • 對頁面進行緩存

     因內容而異,如果是不經常改變的內容,設置緩存的時間要長一些,從而減少服務器的壓力。

  • 不要使用iframe 控件

     iframe 會阻礙頁面的執行,最好不要使用,況且也不利於搜索引擎的收錄。

  • 頁面的html標簽不要放到一個大標簽里面

     因為一個標簽在結束之前是不會呈現內容的,如果都把頁面的內容都到一個表格中,只有到</table> 表格中的內容才會顯示出來。

2、 后台的優化

  • 使用緩存

     建立多級別的緩存策略,可以考慮先單機緩存,然后再考慮分布式緩存。分布式緩存可以考慮使用 memcached 或者 redis,redis 提供了更多的存儲類型,並支持數據寫入磁盤的功能。

  • 網站考慮使用消息隊列

     消息隊列可以對系統進行解耦,並可提高系統的處理能力,減少數據庫的壓力。如果是微軟路線可以考慮用MSMQ。

  • 業務處理層不要使用單例模式

     因為單例模式的話,會阻礙多線程和多核系統的處理,降低系統的吞吐量和處理能力。

  • Stringbulder 代替 string

     如果字符串內容多的話,考慮使用Stringbulder 增加字符串的處理能力。

3、 數據庫的優化

  • 數據庫讀寫分離

      這種方式是指利用數據庫的復制或鏡像功能,同時在多台數據庫上保存相同的數據,並且將讀操作和寫操作分開,寫操作集中在一台主數據庫上,讀操作集中在多台 從數據庫上,對於讀取比寫更多的站點適合使用這種方式。

  • 使用分區表

     表進行分區后,邏輯上表仍然是一張完整的表,只是將表中的數據在物理上存放到多個表空間(物理文件上),這樣查詢數據時,不至於每次都掃描整張表。提高數據庫的查詢性能。

  • 分庫分表

     划分不同的業務模塊放到不同的數據庫上,如 訂單庫、會員庫、商品庫等。

  • 建立合適的索引

     在經常查詢或分組的列上,建立相應的索引來提高查詢性能。

 

 
分類:  程序優化架構設計


免責聲明!

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



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