1. 程式人生 > >解決高併發的常見策略

解決高併發的常見策略

一個運營的系統在正式上線後將會遇到各種層級的高併發請求,因此我們必須對此做出相應的策略和技術解決方案,首先我們需要認清系統的高併發由3個層面導致:

1.傳輸層
大量使用者對系統請求後,將會造成網路頻寬和Web伺服器的I/O瓶頸。

2.計算層
接收大量使用者請求進行計算,將會造成業務伺服器和業務支撐伺服器的瓶頸。

3.儲存層
傳輸層和計算層將會產生大量的資料,資料量暴增,將會導致資料庫和儲存上的瓶頸。

針對以上將會造成的系統高併發瓶頸,我們需要採用不同的技術手段解決。

從總體上來看
1.首先需要解決網路頻寬和Web請求的高併發,需要合理的加大伺服器和頻寬的投入,並且需要充分的利用系統中軟體、硬體的快取機制,將能快取的內容都進行快取儲存,減少計算層和儲存層的壓力。

2.其次需要對業務伺服器和業務支撐伺服器進行合理的分層,並且採用平行計算和分散式演算法對大量計算進行處理,並且在開發的過程中需要採用Java SDK中併發包(Concurrency)進行編碼實現。

3.儲存層需要採用分散式檔案伺服器和列式的儲存伺服器進行構建,支撐海量資料的存放和讀取,並且還要對關係型資料進行深層次的配置引數優化。

4.我們還需要清楚的認識到,將來根據系統執行的狀態以及平臺中不同的業務場景循序漸進的進行調整和優化。

   對於大型系統來說,採用的技術是涉及面非常廣,從硬體到軟體、程式語言、資料庫、WebServer、防火牆等各個領域都有了很高的要求。在面對大量使用者訪問、高併發請求方面,基本的解決方案集中在這樣幾個環節:將會使用高效能的伺服器、高效能的資料庫、高效率的程式語言、還有高效能的Web容器。    但是除了這幾個方面,還沒法根本解決面臨的高負載和高併發問題,所以需要將計算和負載的壓力分載到每個計算機上,使用不同的伺服器叢集機組進行分散式和平行計算,面對所產生的壓力,下面這張圖清晰的描述了,我們對系統中不同的計算瓶頸採用的不同解決手段,如圖所示:
以下描述是針對不同層面產生的計算壓力所採用的計算策略,清單如下: 傳輸層 1.CDN     網路鏈路出口進行壓力分載,通過CDN讓使用者訪問最近的資料快取。 2.智慧雙路     針對電信、網通 不同的訪問使用者訪問請求,對應使用者訪問請求進行伺服器頻寬的智慧切換。 3.LVS     對使用者的請求進行壓力分載,並且實現多種負載均衡的策略,也可以選擇使用HA-Proxy實現。 4.HA-Proxy    針對Web伺服器進行方向代理,通過HA-Proxy將使用者的請求分發到不同的Web伺服器上。 5.Long-Polling     在Web伺服器上採用的一種策略,專門針對某個使用者需要不斷頻繁的輪詢訪問。 6.Session2Cache     將使用者的會話進行集中處理,存放在中央式的快取伺服器當中,減少伺服器之間的會話通訊 計算層
1.MapReduce    採用最經典的分散式演算法對海量資料進行處理,將計算進行分載。 2.BSP     BSP(Bulk Synchronous Parallel-大型同步模型)演算法是基於MPI演算法的基礎進行演化,運用在系統中平行計算的部分。 3.Result Cache     將計算的一部分結果進行快取,緩解對儲存層讀取的請求。 4.Scatter/Gather     中間通過一個伺服器進行中轉,將大量的請求分發給內部的伺服器進行計算,類似前端的web反向代理。 儲存層 1.讀寫分離     由於系統的讀大於寫的頻率,資料庫架構採用了1主/多從,雙主多從的策略,所以我們將會將讀和寫進行分離,並且將大量的讀請求分散給多臺不同的(Slave)伺服器。 2.分割槽策略     系統採用不同的時間段作為分割槽的主要策略,提高對資料的讀寫效能。 3.Sharding     一臺資料庫將很快無法滿足大量併發,需要使用庫表雜湊,將資料庫中的資料進行分散儲存。 4.Column-Based    使用在海量資料中的查詢功能,採用列模式的儲存方式將可以有效的提高系統查詢效率。