7月27日,,我收到百度的面試邀約(8月1日),,興奮之余,我也做了5天的面試準備,。從下午兩點開始一直面試到五點半,,長達三個半小時的面試也讓我知道百度確實是一家重視技術(shù)的公司,。其中有一道面試題尤其讓我印象深刻,因為它分別是一面和二面的 “壓軸題”,,可以說這道面試題自己回答的好與否直接決定著自己能否進入下一輪面試,,今天我主要就從這道面試題開始,一步一步講解其中涉及到的知識點,。這次的面經(jīng)(四面)會在下一篇文章總結(jié)后分享給大家,。 面試真題真題: PHP 如何解決網(wǎng)站大流量與高并發(fā)的問題(一面最后一題) 變體: 網(wǎng)站高并發(fā)的優(yōu)化方法,從瀏覽器到服務(wù)器中間經(jīng)過所有組件的你能想到的優(yōu)化點(二面最后一題) 考點分析
說明由于涉及到的知識點太多,,我這里先給出我當時回答的總的結(jié)構(gòu),,之后會對每個分點進行更為詳細的分析,,如果你有更好的答案,,或者有一些遺漏的點還請指出。 高并發(fā)架構(gòu)相關(guān)概念并發(fā)(百度百科的定義): 并發(fā),,在操作系統(tǒng)中,,是指一個時間段中有幾個程序都處于已啟動運行到運行完畢之間,且這幾個程序都是在同一處理機上運行,,但任意時刻點上都只有一個程序在處理機上運行 web開發(fā)中說的高并發(fā)指的是什么,? 上面的定義明顯不是我們通常所言的并發(fā),在互聯(lián)網(wǎng)時代,,所講的并發(fā),、高并發(fā),通常是指并發(fā)訪問,。也就是在某個時間點,,有多少個訪問同時到來,通常如果一個系統(tǒng)的日 PV 在干萬以上,,有可能是一個高并發(fā)的系統(tǒng),。 高并發(fā)的問題,我們具體該關(guān)心什么? QPS: 每秒鐘請求或者査詢的數(shù)量,在互聯(lián)網(wǎng)領(lǐng)域,,指毎秒響應(yīng)請求數(shù)(指 HTTP 請求),,一個頁面中可能有多個 HTTP 請求。 吞吐量: 單位時間內(nèi)處理的請求數(shù)量(通常由QPS與并發(fā)數(shù)決定) 響應(yīng)時間: 從請求發(fā)出到收到響應(yīng)花費的時間,。例如系統(tǒng)處理一個 HTTP 請求需要 100ms,,這個 100ms 就是系統(tǒng)的響應(yīng)時間 PV: 綜合瀏覽量(Pageview),即頁面瀏覽量或者點擊量 UV: 獨立訪客(UniqueVisitor),,即一定時間范圍內(nèi)相同訪客多次訪問網(wǎng)站,只計算為 1 個獨立訪客 帶寬: 計算帶寬大小需關(guān)注兩個指標,,峰值流量和頁面的平均大小
常用的壓測工具 ApacheBench,、WRK,、http_load,、Web bench、Siege,、Apache Jmeter ApacheBench 概念 ApacheBench(ab),,是 Apache 官方推出的工具刨建多個并發(fā)訪問線程,模擬多個訪問者同時對某一 URL 地址進行訪問,。它的測試目標是基于 URL 的,,因此,它既可以用來測試 Apache 的負載壓力,,也可以測試 Nginx,、 Lighttpd、 Tomcat,、IS 等其它 Web 服務(wù)器的壓力,。 ApacheBench 的使用 模擬并發(fā)請求 1000次,總共請求 50000次 ab -c 1000 -n 50000 www. 注意事項
高并發(fā)解決方案(優(yōu)化方案) 流量層優(yōu)化:
前端層優(yōu)化:
服務(wù)器層優(yōu)化:
數(shù)據(jù)庫層優(yōu)化:
Web 服務(wù)器架構(gòu)優(yōu)化:
流量層優(yōu)化(防盜鏈處理)如果我們發(fā)現(xiàn)我們的網(wǎng)站主頁的流量很大(服務(wù)器負荷很重)但是網(wǎng)站的 PV,、UV 卻很小,這時候我們就需要考慮我們的網(wǎng)站是不是被盜鏈了,。 盜鏈概念 盜鏈是指在自己的頁面上展示一些并不在自己服務(wù)器上的內(nèi)容獲得他人服務(wù)器上的資源地址,,繞過別人的資源展示頁面,直接在自己的頁面上向最終用戶提供此內(nèi)容,常見的是小站盜用大站的圖片,、音樂,、視頻、軟件等資源,,通過盜鏈的方法可以減輕自己服務(wù)器的負擔,,因為真實的空間和流量均是來自別人的服務(wù)器。 防盜鏈概念 防止別人通過一些技術(shù)手段繞過本站的資源展示頁面,,盜用本站的資源,,讓繞開本站資源展示頁面的資源鏈接失效,可以大大減輕服務(wù)器及帶寬的壓力,。 工作原理 通過 Referer 或者簽名,,網(wǎng)站可以檢測目標網(wǎng)頁訪問的來源網(wǎng)頁,如果是資源文件,,則可以跟蹤到顯示它的網(wǎng)頁地址,。一旦檢測到來源不是本站即進行阻止或者返回指定的頁面。 Referer 方式防盜鏈 Nginx 模塊 ngx_http_referer_module 用于阻擋來源非法的域名請求,。 配置
valid_referers none I blocked I server_names,string 解釋
加密簽名防盜鏈 Referer 這種方式雖然可以防止一下低中級的防盜鏈,,但是更高級的盜鏈往往可以偽造 Referer,,從而繞過 Referer 檢測,更安全的方式是可以采用加密簽名解決 ,。 使用第三方模塊 HttpaccesskeyModule 實現(xiàn) Nginx 防盜鏈 Nginx 配置:
PHP 代碼段:
前端層優(yōu)化減少 HTTP 請求 性能黃金法則: 只有 10% - 20% 的最終用戶響應(yīng)時間花在接收請求的 HTML 文檔上,,剩下的 80% - 90% 時間花在 HTML 文檔所引用的所有組件(圖片,腳本,,CSS,,F(xiàn)lash 等等)進行的 HTTP 請求上。 如何改善: 改善響應(yīng)時間的最簡單途徑就是減少組件數(shù)量,,并由此減少 HTTP 請求的數(shù)量,。 減少 HTTP 請求的方式 圖片地圖 圖片地址允許你在一個圖片上關(guān)聯(lián)多個 URL,目標 URL 的選擇取決于用戶單擊了圖片上的哪個未知,。
CSS 精靈(CSS Sprites) Sprites 中文翻譯為 CSS 精靈,通過使用合并圖片,,通過指定 CSS 的 background-image 和 background-position 來顯示元素,。 合并腳本和樣式表
圖片使用 Base64 編碼減少頁面請求數(shù) 采用 Base64 的編碼方式將圖片直接嵌入到網(wǎng)頁中,,而不是從外部載入。 添加異步請求 Ajax 可以實現(xiàn)動態(tài)不刷新(局部刷新),,就是能在不更新整個頁面的前提下維護數(shù)據(jù),。這使得 Web 應(yīng)用程序更為迅捷地回應(yīng)用戶動作,并避免了在網(wǎng)絡(luò)上發(fā)送那些沒有改變過的信息,。 優(yōu)勢:
啟用瀏覽器緩存和文件壓縮 緩存分類: HTTP 緩存模型中,,如果請求成功會有三種請款
本地緩存 瀏覽器認為本地緩存可以使用,不會去請求服務(wù)端 相關(guān) Header:
協(xié)商緩存 當瀏覽器沒有命中本地緩存,,如本地緩存過期或者響應(yīng)中聲明不允許直接使用本地緩存,那么瀏覽器肯定會發(fā)起服務(wù)端請求,,服務(wù)端會驗證數(shù)據(jù)是否修改,,如果沒有通知瀏覽器使用本地緩存 相關(guān) Header:
適合緩存的內(nèi)容
建議使用協(xié)商緩存
不建議緩存的內(nèi)容
前端代碼和資源的壓縮 優(yōu)勢: 讓資源文件更小,,加快文件再網(wǎng)絡(luò)中的傳輸,,讓網(wǎng)頁更快的展現(xiàn),降低帶寬和流量開銷 壓縮方式: JS,、CSS,、圖片、HTML 代碼的壓縮,、Gzip 壓縮 JavaScript 代碼壓縮:
CSS 代碼壓縮:
使用 CDN 加速 CDN 的全稱是 Content Delivery Network, 即內(nèi)容分發(fā)網(wǎng)絡(luò),,盡可能避開互聯(lián)網(wǎng)上有可能影響數(shù)據(jù)傳輸速度和穩(wěn)定性的瓶頸和環(huán)節(jié),,使內(nèi)容傳輸?shù)母欤€(wěn)定,。
使用 CDN 的優(yōu)勢
建立獨立的圖片服務(wù)器 好處
服務(wù)器層優(yōu)化頁面靜態(tài)化(動態(tài)語言靜態(tài)化)
使用場景 對實時性要求不高的頁面 好處
PHP 的并發(fā)處理 PHP 的 Swoole 擴展
消息隊列 使用場景 用戶注冊:
日志處理:
常見消息隊列產(chǎn)品 Kafka、 Activemq,、 Zeros,、 Rabbitmq、 Redis 等 數(shù)據(jù)庫層優(yōu)化數(shù)據(jù)庫緩存(Memache, Redis) MySQL 等一些常見的關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)都存儲在磁盤當中,,在高并發(fā)場景下,,業(yè)務(wù)應(yīng)用對 MySQL 產(chǎn)生的增、刪,、改,、查的操作造成巨大的 I/O 開銷和查詢壓力,這無疑對數(shù)據(jù)庫和服務(wù)器都是一種巨大的壓力,,為了解決此類問題,,緩存數(shù)據(jù)的概念應(yīng)運而生。 優(yōu)點:
使用 Memcache 緩存查詢數(shù)據(jù) 對于大型站點,如果沒有中間緩存層,,當流量打入數(shù)據(jù)庫層時,,即便有之前的幾層為我們擋住一部分流量,但是在大并發(fā)的情況下,,還是會有大量請求涌入數(shù)據(jù)庫層,,這樣對于數(shù)據(jù)庫服務(wù)器的壓力沖擊很大,響應(yīng)速度也會下降,,因此添加中間緩存層很有必要,。 工作原理 Memcache 是一個高性能的分布式的內(nèi)存對象緩存系統(tǒng),通過在內(nèi)存里維護一個統(tǒng)一的巨大的 hash 表,,它能夠用來存儲各種格式的數(shù)據(jù),,包括圖像、視頻,、文件以及數(shù)據(jù)庫檢索的結(jié)果等,。簡單的說就是將數(shù)據(jù)調(diào)用到內(nèi)存,然后從內(nèi)存中讀取,,從而大大提高讀取速度 使用 Redis 綬存查詢數(shù)據(jù) Memcache 的區(qū)別:
數(shù)據(jù)表數(shù)據(jù)類型優(yōu)化
索引優(yōu)化
SQL 語句的優(yōu)化 使用慢查詢?nèi)罩菊业叫枰獌?yōu)化的 SQL 語句,,一般會再用 explain 分析,。
數(shù)據(jù)庫服務(wù)器架構(gòu)的優(yōu)化
Web 服務(wù)器架構(gòu)優(yōu)化七層負載均衡的實現(xiàn)
Nginx 的簡單配置
四層負載均衡的實現(xiàn)
|
|