高併發設計技術方案
一、負載均衡
對於一些大型系統,一般會採用 DNS+四層負載+七層負載的方式進行多層次負載均衡
-
演算法:隨機演算法、輪詢演算法、輪詢權重演算法、一致性雜湊演算法、最小連線、自適應演算法。
-
負載均衡工具:LVS、Nginx、HAProxy
二、分散式微服務
常用微服務框架有:Spring Cloud 、Dubbo 、kubernetes、gRPC、Thrift 等
- 按照業務劃分服務,單個服務程式碼量小,業務單一,容易維護。
- 每個微服務都有自己獨立的基礎元件,例如資料庫。
- 微服務之間的通訊是透過HTTP協議或者私有協議,且具有容錯能力。
- 微服務有一套服務治理的解決方案,服務之間不耦合,可以隨時加入和剔除。
- 單個微服務能夠叢集化部署,有負載均衡的能力。
- 整個微服務系統應該有完整的安全機制,包括使用者驗證,許可權驗證,資源保護。
- 整個微服務系統有鏈路追蹤的能力。
- 有一套完整的實時日誌系統。
三、快取機制
效能不夠,快取來湊。要想快速提升效能,快取肯定少不了,快取能夠帶來效能的大幅提升。以 Memcache 為例,單臺 Memcache 伺服器簡單的 key-value 查詢能夠達到 TPS 50000 以上,Redis效能資料是10W+ QPS。
- 常見的快取: 分為本地快取和分散式快取,區別在與是否要走網路通訊。
- 常見快取策略:
- Cache aside,通常會先更新資料庫,然後再刪除快取,為了兜底還會設定快取時間。
- Read/Write through, 一般是由一個 Cache Provider 對外提供讀寫操作,應用程式不用感知操作的是快取還是資料庫。
- Write behind,延遲寫入,Cache Provider 每隔一段時間會批次寫入資料庫,大大提升寫的效率。像作業系統的page cache也是類似機制。
四、分散式關係型資料庫
- MySQL資料庫採用B+數索引,三層結構,為了保證IO效能,一般建議單表儲存 千萬 條資料。
- 如果遇到單機資料庫效能瓶頸,我們可以考慮分表。分表又可以細分為 垂直分表 和 水平分表 兩種形式。
1、垂直分表
資料表垂直拆分就是縱向地把一張表中的列拆分到多個表,表由“寬”變“窄”,簡單來講,就是將大表拆成多張小表,一般會遵循以下幾個原則:
- 冷熱分離,把常用的列放在一個表,不常用的放在一個表。
- 欄位更新、查詢頻次拆分。
- 大欄位列獨立存放。
- 關係緊密的列放在一起。
2、水平分表
表結構維持不變,對資料行進行切分,將表中的某些行切分到一張表中,而另外的某些行又切分到其他的表中,也就是說拆分後資料集的並集等於拆分前的資料集.
分庫分表技術點:
- SQl組合。因為是邏輯表名,需要按分表鍵計算對應的物理表編號,根據邏輯重新組裝動態的SQL。
- 資料庫路由。如果採用分庫,需要根據邏輯的分表編號計算資料庫的編號。
- 結果合併。如果查詢沒有傳入指定的分表鍵,會全庫執行,此時需要將結果合併再輸出。
五、分散式訊息佇列
六、CDN
CDN 全稱 (Content Delivery Network),內容分發網路。目的是在現有的網路中增加一層網路架構,將網站的內容釋出到最接近使用者的網路“邊緣”,使使用者可以就近取得所需的內容,提高使用者訪問網站的響應速度。
CDN = 映象(Mirror)+快取(Cache)+整體負載均衡(GSLB)。
CDN都以快取網站中的靜態資料為主,如:CSS、JS、圖片和靜態頁面等資料。使用者從主站伺服器中請求到動態內容後,再從CDN下載靜態資料,從而加速網頁資料內容的下載速度。