2017-5-3/高性能網站架構

来源:http://www.cnblogs.com/sunshineliulu/archive/2017/09/04/7474292.html
-Advertisement-
Play Games

1. 講講你認為的高性能網站架構,或者說現在流行的網站架構。 2. 什麼是一主多從? 3. 什麼是負載均衡? ...


1. 講講你認為的高性能網站架構,或者說現在流行的網站架構。   性能是網站的一個重要指標,是網站架構設計的一個重要方面。衡量性能有一系列指標,重要的有響應時間、TPS、系統性能計數器等,通過測試這些指標可以確定系統設計是否達到目標,分析瓶頸,預測網站容量,並對異常指標進行報警,保障系統可用性。根據網站分層架構,網站的性能優化可分為Web前端性能優化、應用伺服器性能優化、存儲性能優化三個方面。 1)Web前端性能優化 (1)瀏覽器訪問優化
  • 減少HTTP請求
    ① 將瀏覽器一次訪問需要的CSS、JavaScript合併成一個文件。
    ② 多張圖片合併成一張。
  • 使用瀏覽器緩存
    ① 設置HTTP頭中的Cache-Control和Expires屬性,將一些更新頻率比較低但又是每次HTTP請求都需要的靜態資源文件,如CSS、JavaScript、Logo、圖標等,緩存在瀏覽器中,改善性能。
    ② 有時,靜態資源文件需要及時應用到客戶端瀏覽器,可通過生成新的JavaScript文件來更新HTML中文件的引用,而不是更新JavaScript文件內容。
    ③ 使用瀏覽器緩存策略更新的網站,在更新靜態資源時應採用批量更新的方法,比如需要更新10個圖標文件,不宜把10個文件一次全部更新,而是應該一個文件一個文件逐步更新,且兩個文件之間具有一定的時間間隔,以免用戶瀏覽器突然大量緩存失效,集中更新緩存,造成伺服器負載驟增、網路堵塞的情況。
  • 啟用壓縮
    在伺服器端對文件進行壓縮,在瀏覽器端對文件進行解壓縮,可有效減少通信傳輸的數據量。但是壓縮對伺服器和瀏覽器產生一定的壓力,在通信帶寬良好,而伺服器資源不足的情況下要權衡考慮。
  • CSS放在頁面最上面,JavaScript放在頁面底部
    瀏覽器會在下載全部CSS之後,才會對整個頁面進行渲染,所以CSS放在頁面最上面,讓瀏覽器儘快下載CSS;而瀏覽器載入JavaScript後會立即執行,可能會阻塞整個頁面,造成頁面顯示緩慢,因此JavaScript放在頁面底部。
  • 減少cookie傳輸
    一方面,cookie包含在每次請求和響應中,太大的數據量會影響數據傳輸;另一方面,對於某些靜態資源的訪問,如CSS、JavaScript等,發送cookie沒有意義,可以考慮靜態資源使用獨立功能變數名稱訪問,避免請求靜態資源時發送cookie,減少cookie傳輸的次數。
(2)CDN加速
  • CDN的本質仍然是一個緩存,將數據緩存在離用戶最近的地方,使用戶以最快的速度獲取數據。
  • CDN能夠緩存的一般是靜態資源,如圖片、文件、CSS、JavaScript腳本、靜態網頁等,這些文件的訪問頻度很高,將其緩存在CDN中,可極大改善網頁打開的速度。
  • 當用戶的請求到達CDN伺服器後,如果CDN中存在瀏覽器請求的資源,就直接返回給瀏覽器,最短路徑返迴響應,加快用戶訪問速度,減少數據中心負載壓力。
(3)反向代理   反向代理伺服器位於網站機房一側,代理網站web伺服器接收HTTP請求。
  • 安全功能 任何來自互聯網的訪問請求必須經過反向代理伺服器。
  • 緩存功能 當用戶第一次訪問靜態內容的時候,靜態內容就被緩存在反向代理伺服器上,這樣當其他用戶訪問該靜態內容的時候,就可以直接從反向代理伺服器返回,加速web請求響應速度,減輕web伺服器負載壓力。
  • 負載均衡功能 充當負載均衡伺服器均衡地分發請求,平衡集群中各個伺服器的負載壓力。
2)應用伺服器性能優化 (1)分散式緩存   網站數據訪問通常遵循二八定律,即80%的訪問落在20%的數據上,因此,利用緩存可以提高數據訪問速度,降低存儲訪問壓力,改善系統性能。   緩存主要用來存放那些讀寫比很高、很少變化的數據,如商品的類目信息、熱門詞的搜索列表信息、熱門商品信息等。應用程式讀取數據時,先到緩存中讀取,如果讀取不到或數據已經失效,再訪問資料庫,並將數據寫入緩存。 (2)非同步操作   如果不使用消息隊,用戶的請求直接寫入資料庫,在高併發情況下,會對資料庫造成巨大的壓力,響應延遲加劇。使用消息隊列將調用非同步化,用戶請求的數據發送給消息隊列後立即返回,再由消息隊列的消費者進程從消息隊列中獲取數據,非同步寫入資料庫,從而改善網站系統的性能。 (3)使用集群   在網站高併發場景,使用負載均衡技術為一個應用構建一個由多台伺服器組成的伺服器集群,將併發訪問請求分發到多台伺服器上處理,避免單一伺服器因負載壓力過大而響應緩慢。 (4)代碼優化
  • 使用多線程
    利用多線程IO阻塞與執行交替進行,可最大限度地利用CPU資源。
  • 資源復用
    系統運行時,儘量減少開銷很大的系統資源的創建和銷毀,如資料庫鏈接、網路通信連接、線程、對象等。資源復用主要有兩種模式:單例和對象池。
  • 數據結構
    在不同場景中合理使用恰當的數據結構,靈活組合各種數據結構改善數據讀寫和計算特性,可以極大優化程式性能。
  • 垃圾回收
    一個對象,可以有一個或多個引用變數指向它。當一個對象不再有任何一個引用變數指向它時,這個對象就被應用拋棄了。也就是這個對象可以被垃圾回收機制回收了。垃圾回收機制有助於程式優化和參數調優,以及編寫記憶體安全的代碼。
3)存儲性能優化 (1)機械硬碟 VS 固態硬碟   相比機械硬碟,固態硬碟SSD具有功耗更小、磁碟震動與雜訊更小的特性。 (2)B+樹 VS LSM樹
  • 傳統資料庫使用B+樹來改善數據訪問特性。B+樹是一種專門針對磁碟存儲而優化的N叉排序樹,以樹節點為單位存儲在磁碟中,從根開始查找所需數據所在的節點編號和磁碟位置,將其載入到記憶體中然後繼續查找,直到找到所需的數據。缺點是由於每次磁碟訪問都是隨機的,且傳統機械硬碟在數據隨機訪問時性能較差,每次數據訪問都需要多次訪問磁碟影響數據訪問性能。
  • LSM樹可以看作是一個N階合併樹。數據寫操作(包括插入、修改、刪除)都在記憶體中進行,並且都會創建一個新記錄,這些數據在記憶體中仍然還是一棵排序樹。在需要進行讀操作時,總是從記憶體中的排序樹開始搜索,如果沒有找到,就從磁碟上的排序樹順序查找。在LSM樹上進行一次數據更新不需要磁碟訪問,在記憶體即可完成,速度遠快於B+樹。當數據訪問以寫操作為主,而讀操作則集中在最近寫入的數據上時,使用LSM樹可以極大程度地減少磁碟的訪問次數,加快訪問速度。
(3)RAID VS HDFS
  • RAID(廉價磁碟冗餘陣列)技術主要是為了改善磁碟的訪問延遲,增強磁碟的可用性和容錯能力。
  • HDFS(Hadoop分散式文件系統)在整個存儲集群的多台伺服器上進行數據併發讀寫和備份,可以看做在伺服器集群規模上實現了類似RAID的功能,因此不需要磁碟RAID。
2. 什麼是一主多從? 目前大部分主流資料庫都提供主從熱備功能,通過配置資料庫的主從關係,將一臺資料庫伺服器的數據更新同步到另一臺伺服器上,從而實現資料庫讀寫分離,改善資料庫負載壓力。 應用伺服器在寫數據的時候,訪問主資料庫,主資料庫通過主從複製機制將數據更新同步到從資料庫,這樣當應用伺服器讀數據的時候,可以通過從伺服器獲得數據。 怎麼進行主從複製? MySQL在寫入數據之前,會先寫日誌,這個術語叫WAL,即write after log,就是在日誌之後再寫入數據。對主MySQL伺服器的binlog(binary log,二進位日誌)進行解析,然後寫入到從mysql伺服器中。過程如下: ① Master將數據變化記錄到二進位日誌中; ② Slave將master的二進位日誌拷貝到它的中繼日誌(relay log)中; ③ Slave重做中繼日誌中的事件,將數據變化,並反映到它自己的資料庫中。 為什麼要進行主從複製? ① 數據備份 對數據進行備份,降低數據丟失的風險。 ② 負載均衡 主要用於MySQL集群,解決單點故障或者故障切換,降低單台服務的負載,使訪問均衡或讀寫分離。 ③ 數據分發 主要用於多數據中心的數據分發與同步。 ④ 高可用和數據容錯性 檢測主庫是否正常工作,一旦發現主庫宕機或無法正常工作,就會選擇到最好的一個備庫上。   3. 什麼是負載均衡?   負載均衡負載均衡有兩方面的含義:首先,大量的併發訪問或數據流量分擔到多台節點設備上分別處理,減少用戶等待響應的時間;其次,單個重負載的運算分擔到多台節點設備上做並行處理,每個節點設備處理結束後,將結果彙總,返回給用戶,系統處理能力得到大幅度提高。比如,當大量用戶同時登陸網站時,可以把不同人群的請求,分發到不同伺服器上進行處理,完成類似的功能。假如有10台應用伺服器,100個用戶訪問,那就可以平均地將這100個用戶分發到這不同的10台應用伺服器上進行登陸驗證。不一定是平均10個,分發數量視分發演算法而定。   負載均衡也有一些演算法,最簡單的是哈希取餘法。根據獲取客戶端的IP地址,通過哈希函數計算得到的一個數值,用該數值對機器數量取餘,得到的結果便是客服端要訪問伺服器的序號。假設有10台伺服器,編號是0-9,101%10,餘數是1,就分發到1號伺服器上,102%10,餘數是2,就分發到2號伺服器上。以此類推,根據餘數將不同請求分發到0-9號伺服器上。這種演算法的缺點就是當添加或移除伺服器時,餘數發生變化,這樣就無法獲取與保存時相同的伺服器,從而影響緩存的命中率。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...