【BAT面試題】如何應對大流量、高併發??

這是一道BAT大廠的面試題css

所謂高併發指的是:在同時或極短期內,有大量的請求到達服務端,每一個請求都須要服務端耗費資源進行處理,並作出相應的反饋。

經常使用的高併發處理的思路與手段

從服務端視角看高併發

服務端處理請求須要耗費服務端的資源,好比能同時開啓的進程數、能同時運行的線程數、網絡鏈接數、cpu、I/O、內存等等,因爲服務端資源是有限的,那麼服務端能同時處理的請求也是有限的。高併發問題的本質就是:資源的有限性前端

高併發帶來的問題

服務端的處理和響應會愈來愈慢,甚至會丟棄部分請求不予處理,更嚴重的會致使服務端崩潰。面試

高併發處理的基本思路

1)從客戶端看
  • 儘可能減小請求數量,好比:依靠客戶端自身的緩存或處理能力
  • 儘可能減小對服務端資源的沒必要要耗費,好比:重複使用某些資源,如鏈接池客戶端處理的基本原則就是:能不訪問服務端就不要訪問
2)從服務端看
  • 增長資源供給,好比:更大的網絡帶寬,使用更高配置的服務器,使用高性能的Web服務器,使用高性能的數據庫
  • 請求分流,好比:使用集羣,分佈式的系統架構
  • 應用優化,好比:使用更高效的編程語言,優化處理業務邏輯的算法,優化訪問數據庫的SQL

基本原則:分而治之,並提升單個請求的處理速度算法

高併發處理的基本手段

1)客戶端發出請求層面,常見的手段有:
  • 儘可能利用瀏覽器的緩存功能,減小訪問服務端,好比:js、css、圖片等
  • 能夠考慮使用壓縮傳輸的功能,減小網絡流量,也會提升傳輸速度
  • 考慮使用異步請求,分批獲取數據
2)前端接收客戶端請求層面,常見的手段有:
  • 動靜分離,部分靜態資源能夠直接從Nginx返回
  • 按請求的不一樣,分發到不一樣的後端進行處理,好比:負載均衡、業務拆分訪問等
  • 前面再加上一層來作多個Nginx的負載均衡,好比:LVS、F5等
  • 還能夠在更前面使用CDN服務
  • 還能夠對動態內容進行緩存,儘可能減小訪問後端服務
3)Web服務器層面,常見的手段有:
  • 使用最新的JVM,並進行配置優化
  • 對Web服務器進行配置優化,好比:調整內存數量、線程數量等
  • 提供多個能提供相同服務的Web服務器,以實現負載均衡
  • 仔細規劃Web服務器上部署的應用規模
  • 對Web服務器進行集羣
4)Web應用層面,常見的手段有:
  • 動態內容靜態化
  • Java開發優化
  • 優化處理業務邏輯的算法
  • 合理高效的利用緩存
  • 優化訪問數據庫的Sql,能夠考慮利用存儲過程等數據庫的能力
  • 合理使用多線程,加快業務處理
  • 部分業務能夠考慮內存數據庫,或者是進行純內存處理
  • 儘可能避免遠程調用、大量I/O等耗時的操做
  • 合理規劃事務等較爲耗資源的操做
  • 合理使用異步處理
  • 對部分業務考慮採用預處理或者預計算的方式,減小實時計算量
  • 內部系統間的業務儘可能直接調用、直接處理,減小WebService、工做流等
5)數據庫層面,常見的手段有:
  • 合理選擇數據庫的引擎,好比Mysql的InnoDB與MyISAM引擎
  • 進行配置優化
  • 能夠考慮使用存儲過程來處理複雜的數據邏輯
  • 數據庫集羣,進行讀寫分離
  • 合理設計數據庫的表結構、索引等
  • 分庫、分表,下降單庫、單表的數據量

若有錯誤或其它問題,歡迎小夥伴留言評論、指正。若有幫助,歡迎點贊+轉發分享。sql

歡迎你們關注民工哥的公衆號:民工哥技術之路
image.png數據庫

相關文章
相關標籤/搜索