面试题:如何设计一个高并发的系统?
這道面試題涉及的知識點比較多,主要考察的是面試者的綜合技術(shù)能力。高并發(fā)系統(tǒng)的設(shè)計手段有很多,主要體現(xiàn)在以下五個方面。
1、前端層優(yōu)化
① 靜態(tài)資源緩存:將活動頁面上的所有可以靜態(tài)的元素全部靜態(tài)化,盡量減少動態(tài)元素;通過 CDN、瀏覽器緩存,來減少客戶端向服務(wù)器端的數(shù)據(jù)請求。
② 禁止重復(fù)提交:用戶提交之后按鈕置灰,禁止重復(fù)提交。
③ 用戶限流:在某一時間段內(nèi)只允許用戶提交一次請求,比如,采取 IP 限流。
2、中間層負載分發(fā)
可利用負載均衡,比如 nginx 等工具,可以將并發(fā)請求分配到不同的服務(wù)器,從而提高了系統(tǒng)處理并發(fā)的能力。
nginx 負載分發(fā)的五種方式:
① 輪詢(默認)每個請求按時間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器不能正常響應(yīng),nginx 能自動剔除故障服務(wù)器。
② 按權(quán)重(weight)使用 weight 參數(shù),指定輪詢幾率,weight 和訪問比率成正比,用于后端服務(wù)器性能不均的情況,配置如下:
upstream backend {server 192.168.0.14 weight=10;server 192.168.0.15 weight=10; }③ IP 哈希值(ip_hash)每個請求按訪問 IP 的哈希值分配,這樣每個訪客固定訪問一個后端服務(wù)器,可以解決 session 共享的問題,配置如下:
④ 響應(yīng)時間(fair)按后端服務(wù)器的響應(yīng)時間來分配請求,響應(yīng)時間短的優(yōu)先分配,配置如下:
upstream backend {fair;server server1.com;server server2.com; }⑤ URL 哈希值(url_hash)按訪問 url 的 hash 結(jié)果來分配請求,和 IP 哈希值類似。
upstream backend {hash $request_uri;server server1.com;server server2.com; }3、控制層(網(wǎng)關(guān)層)優(yōu)化
限制同一個用戶的訪問頻率,限制訪問次數(shù),防止多次惡意請求。
4、服務(wù)層優(yōu)化
① 業(yè)務(wù)服務(wù)器分離:比如,將秒殺業(yè)務(wù)系統(tǒng)和其他業(yè)務(wù)分離,單獨放在高配服務(wù)器上,可以集中資源對訪問請求抗壓。
② 采用 MQ(消息隊列)緩存請求:MQ 具有削峰填谷的作用,可以把客戶端的請求先導(dǎo)流到 MQ,程序在從 MQ 中進行消費(執(zhí)行請求),這樣可以避免短時間內(nèi)大量請求,導(dǎo)致服務(wù)器程序無法響應(yīng)的問題。
③ 利用緩存應(yīng)對讀請求,比如,使用 Redis 等緩存,利用 Redis 可以分擔數(shù)據(jù)庫很大一部分壓力。
5、數(shù)據(jù)庫層優(yōu)化
① 合理使用數(shù)據(jù)庫引擎 ② 合理設(shè)置事務(wù)隔離級別,合理使用事務(wù) ③ 正確使用數(shù)據(jù)庫索引
盡量使用主鍵查詢,而非其他索引,因為主鍵查詢不會觸發(fā)回表查詢。
不做列運算,把計算都放入各個業(yè)務(wù)系統(tǒng)實現(xiàn)
查詢語句盡可能簡單,大語句拆小語句,減少鎖時間
不使用 select * 查詢
or 查詢改寫成 in 查詢
不用函數(shù)和觸發(fā)器
避免 %xx 查詢
少用 join 查詢
使用同類型比較,比如 '123' 和 '123'、123 和 123
盡量避免在 where 子句中使用 != 或者 <> 操作符,查詢引用會放棄索引而進行全表掃描
列表數(shù)據(jù)使用分頁查詢,每頁數(shù)據(jù)量不要太大
用 exists 替代 in 查詢
避免在索引列上使用 is null 和 is not null
盡量使用主鍵查詢
避免在 where 子句中對字段進行表達式操作
盡量使用數(shù)字型字段,若只含數(shù)值信息的字段盡量不要設(shè)計為字符型
④ 合理分庫分表 ⑤ 使用數(shù)據(jù)庫中間件實現(xiàn)數(shù)據(jù)庫讀寫分離 ⑥ 設(shè)置數(shù)據(jù)庫主從讀寫分離
【END】
熱文推薦:史上最全面試題詳解?
關(guān)注下方二維碼,訂閱更多精彩內(nèi)容
總結(jié)
以上是生活随笔為你收集整理的面试题:如何设计一个高并发的系统?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: React Native顶|底部导航使用
- 下一篇: 千万不要这样写代码!9种常见的OOM场景