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

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

web應用 增量計算 解決 數據庫定義 另一個 分享 阿裏 數據量 js等

當前在互聯網+的大潮下,眾所周知淘寶、京東這些交易系統每天產生的數據量都是海量的,每天的交易並發也是驚人的,尤其是“雙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種策略,從上面各個技術層面,“分”也是占據了大多數技術的核心思想,所以考慮的時候要多想想分哪裏、如何分,另外很多業務場景還得想想怎麽合。

順便在此給大家推薦一個Java架構方面的交流學習群:698581634,裏面會分享一些資深架構師錄制的視頻錄像:有SpringMyBatisNetty源碼分析,高並發、高性能、分布式、微服務架構的原理,JVM性能優化這些成為架構師必備的知識體系,主要針對Java開發人員提升自己,突破瓶頸,相信你來學習,會有提升和收獲。在這個群裏會有你需要的內容 朋友們請抓緊時間加入進來吧。

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