1. 程式人生 > >面對峰值響應衝擊,解決高併發的三大策略

面對峰值響應衝擊,解決高併發的三大策略

當前在網際網路+的大潮下,眾所周知淘寶、京東這些交易系統每天產生的資料量都是海量的,每天的交易併發也是驚人的,尤其是“雙11”、“6.18”這些活動,對系統的峰值響應提出了非常高的要求,所以對系統架構也就有了很要的要求。

在寫這篇部落格的前2天,聽說某系統在25人的使用者量下就宕機了,實在讓人震驚,所以捋了下網際網路交易系統我們可以採取哪些技術來解決網際網路平臺下大資料量高併發的問題。

首先根據架構分層把不同技術進行了一些分類,如下圖:

網際網路技術架構分層策略圖

接下來我會逐一解釋各個技術的大概原理和思路,供大家參考和學習:

一、網際網路層

1、負載均衡

負載均衡英文名稱為Load Balance,意思就是分攤到多個操作單元上進行執行,例如Web伺服器、FTP伺服器、企業關鍵應用伺服器和其它關鍵任務伺服器等,從而共同完成工作任務。

比如Nginx是一款可以通過反向代理實現負載均衡的伺服器,把流量導向不同的伺服器;現在的雲平臺都提供了負載均衡服務,不過需要單獨付費,比如阿里的SLB。

2、內容分發網路(CDN)

內容分發網路基本思路是儘可能避開網際網路上有可能影響資料傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定。

通過在網路各處放置節點伺服器所構成的在現有的網際網路基礎之上的一層智慧虛擬網路,CDN系統能夠實時地根據網路流量和各節點的連線、負載狀況以及到使用者的距離和響應時間等綜合資訊將使用者的請求重新導向離使用者最近的服務節點上。

其目的,是使使用者可就近取得所需內容,解決Internet網路擁擠的狀況,提高使用者訪問網站的響應速度。這個不需要單獨去實現,可以用現成的產品去做,比如: Akamai(好些,比較貴),Verizon EdgeCast(便宜些),ChinaCach;如果是雲平臺基本上都提供了這個服務,不過也需要付費的,比如阿里雲基於自己的CDN加速提供了不同形式的加速;比如基於P2P技術的PCDN,增強防護DDoS、CC、Web應用攻擊的SCDN以及全站加速。

二、Web伺服器層

1、Session→Cookie

傳統的B/S架構都是把使用者會話放到Session裡面,在線上使用者量不高的情況下沒啥問題,但是對於現在網際網路採取了分散式或者微服務架構,就很難單獨去維護Session了,因為Session會分佈在不同的伺服器上,會話的同步會面臨著很大的問題。所以一種方式是把Session的維護拿到Cookie裡去做,不依賴於某臺或多臺伺服器,同時也減少了伺服器的開銷。當然,也可以利用記憶體快取伺服器來統一儲存Session資訊,有的記憶體快取伺服器還能把記憶體資料持久化到磁碟來提高可用性和可恢復性,就不會有同步問題了。

2、Static page

動態頁面靜態化,為什麼又要把動態網頁以靜態網頁的形式釋出呢?一個很重要的原因就是搜尋引擎;另一個重要原因就是提高程式效能。

很多大型網站,進去的時候看它頁面很複雜,但是載入也沒有耗費多長時間,原因在於先於使用者獲取資源或資料庫資料,進而通過靜態化處理,生成靜態頁面。所有人都訪問這一個靜態頁面,而靜態化處理的頁面本身的訪問速度要較動態頁面快很多倍,因此程式效能會有大大的提升。使用場景是那些經常需要訪問但是資料不經常更新的時候。這種情況就是時候將動態頁面靜態化了,比如淘寶的寶貝資訊頁面,頁面動態部分可以用AJAX載入進來,比如月銷多少筆。

3、Cache

快取,Web服務層的快取依賴於下面三個方面:

  • 瀏覽器端的快取,比如CSS/JS等;

  • 在CDN這類技術當中做大量頁面快取來提高就近訪問速度;

  • 自己搭建記憶體快取伺服器對頻率訪問比較高的頁面進行快取,比如首頁等。

4、Gzip

利用瀏覽器能自動進行Gzip解壓縮的原理對訪問頁面和資源(含圖片、JavaScript、CSS等)進行Gzip壓縮,減少檔案大小,以此來提高網路載入速度。

5、One file

原理是把多個需要載入的內容合成一個檔案,減少載入次數和網路連線時間,提高訪問效率,比如把小圖示集合合成一個大圖片,把CSS/JavaScript 合成到一個檔案裡面。

6、Cluster

叢集和傳統的高效能運算機技術相比,計算機叢集通過一組鬆散整合的計算機軟體和/或硬體連線起來高度緊密地協作完成計算工作。在某種意義上,它們可以被看作是一臺計算機。

集群系統中的單個計算機通常稱為節點,通常通過區域網連線,但也有其它的可能連線方式。叢集計算機通常用來改進單個計算機的計算速度和/或可靠性。一般情況下,叢集計算機比單個計算機(比如工作站或超級計算機)效能價格比要高得多,大多數叢集採用主從式來管理叢集節點,比如Websphere Cluster。

和常見的分散式的不同點在於:叢集是同一個業務部署在多個伺服器上;分散式是一個業務分拆成多個子業務,或者本身就是不同的業務,部署在不同的伺服器上。

簡單地說,分散式是以縮短單個任務的執行時間來提升效率,而叢集則是通過提高單位時間內執行的任務數來提升效率。

三、應用伺服器或者業務伺服器層

1、Distributed/分散式|SC/服務中心|微服務|Decouple/解耦

分散式系統是支援分散式處理的軟體系統,是由通訊網路互聯的多處理機體系結構上執行任務的系統。簡單來說,分散式處理就是多臺相連的計算機各自承擔同一工作任務的不同部分,在人的控制下同時執行,共同完成同一件工作任務。包括分散式作業系統、分散式程式設計語言及其編譯系統、分散式檔案系統、分散式資料庫系統、分散式排程系統等。這常常伴隨需要做負載均衡、熔斷和限流等;還得考慮是全量計算還是增量計算等。

所以隨著分散式的發展,微服務架構就變得越來越流行,它的主要作用是將功能分解到離散的各個服務當中,從而降低系統的耦合性,並提供更加靈活的服務支援,圍繞業務領域元件來建立應用,這些應用可獨立地進行開發、管理和迭代。在分散的元件中使用雲架構和平臺式部署、管理和服務功能,使產品交付變得更加簡單,所以業務的解耦和拆分的就變得越來越重要。

現在隨著容器(Docker)的發展讓分散式、微服務變得更加靈活和容易,也讓現在支援大資料量高併發提供了很好的基礎設施。

2、Cache

這一層的快取主要是對高頻資料進行快取,比如對中間計算結果進行快取,而且是基於記憶體快取居多,比如Memcached和Redis,有的還提供快取持久化,比如Redis。在分散式計算中經常要對批量資料進行快取預讀取以提高計算速度。

3、同步轉非同步/MQ

同步轉非同步的思路一方面不讓程序或者執行緒阻塞在順序執行裡,從而加快程式的執行,就像Node.js用非同步和Java用同步做相同計算測試,好多時候速度Node.js比Java還快,不信大家可以試試,像雙11的搶購都是採用了非同步機制。

另一方面不讓使用者一直等在那裡,使用者可以繼續做別的事情,等非同步執行完畢通知使用者。這裡面大量用到了訊息佇列(MQ),流行的產品很多,最早的WebsphereMQ,到現在的Kafka、RabbitMQ,有些甚至和流行的開源框架緊密整合,比如RabbitMQ和SpringBoot。

四、資料訪問、檔案訪問、內部網路訪問層

1、讀寫分離

因為在大資料量併發情況下,讀的操作頻率遠遠超過寫操作,所以通過讀寫分離來提高讀的速度,其思路是讓主資料庫(master)處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從資料庫(slave)處理SELECT查詢操作,下面是淘寶最早的時候採用的讀寫分離策略:

讀寫分離示意圖

2、DB Cluster

叢集就不再做過多說明,資料庫叢集是利用至少兩臺或者多臺資料庫伺服器,構成一個虛擬單一資料庫邏輯映像,像單資料庫系統那樣,向客戶端提供透明的資料服務。其目的還是為了增加資料吞吐量,提高資料庫效能,滿足大資料量下對資料的讀寫速度要求。

阿里雲的RDS雲資料庫就繼承了上述2大特徵,外面看來是一個MySQL叢集,提供統一的透明訪問,而在內部就自動實現了讀寫分離,為高效能資料庫儲存提供了很大便利。

3、分散式儲存(DAS/NAS/SAN)

三種分散式儲存方案,大家可自行百度,各種介紹比較比較多,這裡不再贅述,比如阿里的OSS儲存也是一種分散式儲存。

4、Cache

快取無處不在,連CPU都有二級快取,在資料訪問這一層,可以根據你的資料需要充分利用快取技術來提供讀寫速度,比如對要求不是特別實時的大資料進行預統計分析,然後快取下來做報表等,這個時候直接從快取裡讀取即可,提高統計速度。

5、NoSQL,Key/Value

NoSQL,泛指非關係型的資料庫。隨著網際網路Web2.0網站的興起,傳統的關係資料庫在應付Web2.0網站已經顯得力不從心,暴露了很多難以克服的問題,而非關係型的資料庫則由於其自身的特點(高可擴充套件性、分散式計算、低成本、架構的靈活性、半結構化資料,沒有複雜的關係)得到了非常迅速的發展。NoSQL資料庫的產生就是為了解決大規模資料集合多重資料種類帶來的挑戰,尤其是大資料應用難題。其資料庫型別有列儲存、文件儲存、Key/Value儲存、物件儲存和圖儲存等。

6、Split/分割,Partition/分割槽

表分割槽是DB對於非常大的表進行優化的一種有效方法,是根據資料庫定義不同的分割槽策略決定的,比如取模、時間和雜湊等,是非常有效的一種手段,在很多情況下比表分割更有效。

比如,有一個程式碼表使用分割槽表把100萬紀錄分在10個分割槽中(ID每從1到10萬為一個分割槽),那樣寫查詢語句的時候,只要給出查詢條件中所需要的程式碼,DB自動會定位到對應的分割槽進行查詢,大大降低的查詢時間。

而採用表分割那必須先根據查詢的程式碼指定所要查詢的表,才能找到相應的記錄,是由DBA或架構師根據業務需要來定義如何分割的。表分割分為水平分割和垂直分割:

  • 水平分割:根據一列或多列資料的值把資料行放到兩個獨立的表中;

  • 垂直分割:把主碼和一些列放到一個表,然後把主碼和另外的列放到另一個表中。

7、BGP

邊界閘道器協議,主要用於網際網路AS(自治系統)之間的互聯,BGP的最主要功能在於控制路由的傳播和選擇最好的路由。中國網通與中國電信都具有AS號(自治系統號),全國各大網路運營商多數都是通過BGP協議與自身的AS號來互聯的。

使用此方案來實現雙線路需要在CNNIC(中國網際網路資訊中心)申請IDC自己的IP地址段和AS號,然後通過BGP協議將此段IP地址廣播到移動,網通、電信等其它的網路運營商,使用BGP協議互聯後移動。網通與電信的所有骨幹路由裝置將會判斷到IDC機房IP段的最佳路由,以保證移動、網通和電信使用者的高速訪問。現在不少的雲平臺都支援BGP。

五、總結

“快取”、“非同步”和“分”是網際網路大資料量高併發下架構策略中用的最多的3種策略,從上面各個技術層面,“分”也是佔據了大多數技術的核心思想,所以考慮的時候要多想想分哪裡、如何分,另外很多業務場景還得想想怎麼合。

一個好訊息,雲端計算已白菜價啦!雲伺服器最低不到300元/年。這裡有一份雲端計算優惠活動列表,來不及解釋了,趕緊上車!