溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

面對(duì)峰值響應(yīng)沖擊,解決高并發(fā)的三大策略

發(fā)布時(shí)間:2020-08-10 18:04:27 來(lái)源:ITPUB博客 閱讀:206 作者:Java大蝸牛 欄目:編程語(yǔ)言

當(dāng)前在互聯(lián)網(wǎng)+的大潮下,眾所周知淘寶、京東這些交易系統(tǒng)每天產(chǎn)生的數(shù)據(jù)量都是海量的,每天的交易并發(fā)也是驚人的,尤其是“雙11”、“6.18”這些活動(dòng),對(duì)系統(tǒng)的峰值響應(yīng)提出了非常高的要求,所以對(duì)系統(tǒng)架構(gòu)也就有了很要的要求。

在寫這篇博客的前2天,聽(tīng)說(shuō)某系統(tǒng)在25人的用戶量下就宕機(jī)了,實(shí)在讓人震驚,所以捋了下互聯(lián)網(wǎng)交易系統(tǒng)我們可以采取哪些技術(shù)來(lái)解決互聯(lián)網(wǎng)平臺(tái)下大數(shù)據(jù)量高并發(fā)的問(wèn)題。

首先根據(jù)架構(gòu)分層把不同技術(shù)進(jìn)行了一些分類,如下圖:

面對(duì)峰值響應(yīng)沖擊,解決高并發(fā)的三大策略

 

互聯(lián)網(wǎng)技術(shù)架構(gòu)分層策略圖

接下來(lái)我會(huì)逐一解釋各個(gè)技術(shù)的大概原理和思路,供大家參考和學(xué)習(xí):

一、互聯(lián)網(wǎng)層

1、負(fù)載均衡

負(fù)載均衡英文名稱為L(zhǎng)oad Balance,意思就是分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行執(zhí)行,例如Web服務(wù)器、FTP服務(wù)器、企業(yè)關(guān)鍵應(yīng)用服務(wù)器和其它關(guān)鍵任務(wù)服務(wù)器等,從而共同完成工作任務(wù)。

比如Nginx是一款可以通過(guò)反向代理實(shí)現(xiàn)負(fù)載均衡的服務(wù)器,把流量導(dǎo)向不同的服務(wù)器;現(xiàn)在的云平臺(tái)都提供了負(fù)載均衡服務(wù),不過(guò)需要單獨(dú)付費(fèi),比如阿里的SLB。

2、內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)

內(nèi)容分發(fā)網(wǎng)絡(luò)基本思路是盡可能避開互聯(lián)網(wǎng)上有可能影響數(shù)據(jù)傳輸速度和穩(wěn)定性的瓶頸和環(huán)節(jié),使內(nèi)容傳輸?shù)母?、更穩(wěn)定。

通過(guò)在網(wǎng)絡(luò)各處放置節(jié)點(diǎn)服務(wù)器所構(gòu)成的在現(xiàn)有的互聯(lián)網(wǎng)基礎(chǔ)之上的一層智能虛擬網(wǎng)絡(luò),CDN系統(tǒng)能夠?qū)崟r(shí)地根據(jù)網(wǎng)絡(luò)流量和各節(jié)點(diǎn)的連接、負(fù)載狀況以及到用戶的距離和響應(yīng)時(shí)間等綜合信息將用戶的請(qǐng)求重新導(dǎo)向離用戶最近的服務(wù)節(jié)點(diǎn)上。

其目的,是使用戶可就近取得所需內(nèi)容,解決Internet網(wǎng)絡(luò)擁擠的狀況,提高用戶訪問(wèn)網(wǎng)站的響應(yīng)速度。這個(gè)不需要單獨(dú)去實(shí)現(xiàn),可以用現(xiàn)成的產(chǎn)品去做,比如: Akamai(好些,比較貴),Verizon EdgeCast(便宜些),ChinaCach;如果是云平臺(tái)基本上都提供了這個(gè)服務(wù),不過(guò)也需要付費(fèi)的,比如阿里云基于自己的CDN加速提供了不同形式的加速;比如基于P2P技術(shù)的PCDN,增強(qiáng)防護(hù)DDoS、CC、Web應(yīng)用攻擊的SCDN以及全站加速。

二、Web服務(wù)器層

1、Session→Cookie

傳統(tǒng)的B/S架構(gòu)都是把用戶會(huì)話放到Session里面,在在線用戶量不高的情況下沒(méi)啥問(wèn)題,但是對(duì)于現(xiàn)在互聯(lián)網(wǎng)采取了分布式或者微服務(wù)架構(gòu),就很難單獨(dú)去維護(hù)Session了,因?yàn)镾ession會(huì)分布在不同的服務(wù)器上,會(huì)話的同步會(huì)面臨著很大的問(wèn)題。所以一種方式是把Session的維護(hù)拿到Cookie里去做,不依賴于某臺(tái)或多臺(tái)服務(wù)器,同時(shí)也減少了服務(wù)器的開銷。當(dāng)然,也可以利用內(nèi)存緩存服務(wù)器來(lái)統(tǒng)一存儲(chǔ)Session信息,有的內(nèi)存緩存服務(wù)器還能把內(nèi)存數(shù)據(jù)持久化到磁盤來(lái)提高可用性和可恢復(fù)性,就不會(huì)有同步問(wèn)題了。

2、Static page

動(dòng)態(tài)頁(yè)面靜態(tài)化,為什么又要把動(dòng)態(tài)網(wǎng)頁(yè)以靜態(tài)網(wǎng)頁(yè)的形式發(fā)布呢?一個(gè)很重要的原因就是搜索引擎;另一個(gè)重要原因就是提高程序性能。

很多大型網(wǎng)站,進(jìn)去的時(shí)候看它頁(yè)面很復(fù)雜,但是加載也沒(méi)有耗費(fèi)多長(zhǎng)時(shí)間,原因在于先于用戶獲取資源或數(shù)據(jù)庫(kù)數(shù)據(jù),進(jìn)而通過(guò)靜態(tài)化處理,生成靜態(tài)頁(yè)面。所有人都訪問(wèn)這一個(gè)靜態(tài)頁(yè)面,而靜態(tài)化處理的頁(yè)面本身的訪問(wèn)速度要較動(dòng)態(tài)頁(yè)面快很多倍,因此程序性能會(huì)有大大的提升。使用場(chǎng)景是那些經(jīng)常需要訪問(wèn)但是數(shù)據(jù)不經(jīng)常更新的時(shí)候。這種情況就是時(shí)候?qū)?dòng)態(tài)頁(yè)面靜態(tài)化了,比如淘寶的寶貝信息頁(yè)面,頁(yè)面動(dòng)態(tài)部分可以用AJAX加載進(jìn)來(lái),比如月銷多少筆。

3、Cache

緩存,Web服務(wù)層的緩存依賴于下面三個(gè)方面:

  • 瀏覽器端的緩存,比如CSS/JS等;

  • 在CDN這類技術(shù)當(dāng)中做大量頁(yè)面緩存來(lái)提高就近訪問(wèn)速度;

  • 自己搭建內(nèi)存緩存服務(wù)器對(duì)頻率訪問(wèn)比較高的頁(yè)面進(jìn)行緩存,比如首頁(yè)等。

4、Gzip

利用瀏覽器能自動(dòng)進(jìn)行Gzip解壓縮的原理對(duì)訪問(wèn)頁(yè)面和資源(含圖片、JavaScript、CSS等)進(jìn)行Gzip壓縮,減少文件大小,以此來(lái)提高網(wǎng)絡(luò)加載速度。

5、One file

原理是把多個(gè)需要加載的內(nèi)容合成一個(gè)文件,減少加載次數(shù)和網(wǎng)絡(luò)連接時(shí)間,提高訪問(wèn)效率,比如把小圖標(biāo)集合合成一個(gè)大圖片,把CSS/JavaScript 合成到一個(gè)文件里面。

6、Cluster

集群和傳統(tǒng)的高性能計(jì)算機(jī)技術(shù)相比,計(jì)算機(jī)集群通過(guò)一組松散集成的計(jì)算機(jī)軟件和/或硬件連接起來(lái)高度緊密地協(xié)作完成計(jì)算工作。在某種意義上,它們可以被看作是一臺(tái)計(jì)算機(jī)。

集群系統(tǒng)中的單個(gè)計(jì)算機(jī)通常稱為節(jié)點(diǎn),通常通過(guò)局域網(wǎng)連接,但也有其它的可能連接方式。集群計(jì)算機(jī)通常用來(lái)改進(jìn)單個(gè)計(jì)算機(jī)的計(jì)算速度和/或可靠性。一般情況下,集群計(jì)算機(jī)比單個(gè)計(jì)算機(jī)(比如工作站或超級(jí)計(jì)算機(jī))性能價(jià)格比要高得多,大多數(shù)集群采用主從式來(lái)管理集群節(jié)點(diǎn),比如Websphere Cluster。

和常見(jiàn)的分布式的不同點(diǎn)在于:集群是同一個(gè)業(yè)務(wù)部署在多個(gè)服務(wù)器上;分布式是一個(gè)業(yè)務(wù)分拆成多個(gè)子業(yè)務(wù),或者本身就是不同的業(yè)務(wù),部署在不同的服務(wù)器上。

簡(jiǎn)單地說(shuō),分布式是以縮短單個(gè)任務(wù)的執(zhí)行時(shí)間來(lái)提升效率,而集群則是通過(guò)提高單位時(shí)間內(nèi)執(zhí)行的任務(wù)數(shù)來(lái)提升效率。

三、應(yīng)用服務(wù)器或者業(yè)務(wù)服務(wù)器層

1、Distributed/分布式|SC/服務(wù)中心|微服務(wù)|Decouple/解耦

分布式系統(tǒng)是支持分布式處理的軟件系統(tǒng),是由通信網(wǎng)絡(luò)互聯(lián)的多處理機(jī)體系結(jié)構(gòu)上執(zhí)行任務(wù)的系統(tǒng)。簡(jiǎn)單來(lái)說(shuō),分布式處理就是多臺(tái)相連的計(jì)算機(jī)各自承擔(dān)同一工作任務(wù)的不同部分,在人的控制下同時(shí)運(yùn)行,共同完成同一件工作任務(wù)。包括分布式操作系統(tǒng)、分布式程序設(shè)計(jì)語(yǔ)言及其編譯系統(tǒng)、分布式文件系統(tǒng)、分布式數(shù)據(jù)庫(kù)系統(tǒng)、分布式調(diào)度系統(tǒng)等。這常常伴隨需要做負(fù)載均衡、熔斷和限流等;還得考慮是全量計(jì)算還是增量計(jì)算等。

所以隨著分布式的發(fā)展,微服務(wù)架構(gòu)就變得越來(lái)越流行,它的主要作用是將功能分解到離散的各個(gè)服務(wù)當(dāng)中,從而降低系統(tǒng)的耦合性,并提供更加靈活的服務(wù)支持,圍繞業(yè)務(wù)領(lǐng)域組件來(lái)創(chuàng)建應(yīng)用,這些應(yīng)用可獨(dú)立地進(jìn)行開發(fā)、管理和迭代。在分散的組件中使用云架構(gòu)和平臺(tái)式部署、管理和服務(wù)功能,使產(chǎn)品交付變得更加簡(jiǎn)單,所以業(yè)務(wù)的解耦和拆分的就變得越來(lái)越重要。

現(xiàn)在隨著容器(Docker)的發(fā)展讓分布式、微服務(wù)變得更加靈活和容易,也讓現(xiàn)在支持大數(shù)據(jù)量高并發(fā)提供了很好的基礎(chǔ)設(shè)施。

2、Cache

這一層的緩存主要是對(duì)高頻數(shù)據(jù)進(jìn)行緩存,比如對(duì)中間計(jì)算結(jié)果進(jìn)行緩存,而且是基于內(nèi)存緩存居多,比如Memcached和Redis,有的還提供緩存持久化,比如Redis。在分布式計(jì)算中經(jīng)常要對(duì)批量數(shù)據(jù)進(jìn)行緩存預(yù)讀取以提高計(jì)算速度。

3、同步轉(zhuǎn)異步/MQ

同步轉(zhuǎn)異步的思路一方面不讓進(jìn)程或者線程阻塞在順序執(zhí)行里,從而加快程序的執(zhí)行,就像Node.js用異步和Java用同步做相同計(jì)算測(cè)試,好多時(shí)候速度Node.js比Java還快,不信大家可以試試,像雙11的搶購(gòu)都是采用了異步機(jī)制。

另一方面不讓用戶一直等在那里,用戶可以繼續(xù)做別的事情,等異步執(zhí)行完畢通知用戶。這里面大量用到了消息隊(duì)列(MQ),流行的產(chǎn)品很多,最早的WebsphereMQ,到現(xiàn)在的Kafka、RabbitMQ,有些甚至和流行的開源框架緊密集成,比如RabbitMQ和SpringBoot。

四、數(shù)據(jù)訪問(wèn)、文件訪問(wèn)、內(nèi)部網(wǎng)絡(luò)訪問(wèn)層

1、讀寫分離

因?yàn)樵诖髷?shù)據(jù)量并發(fā)情況下,讀的操作頻率遠(yuǎn)遠(yuǎn)超過(guò)寫操作,所以通過(guò)讀寫分離來(lái)提高讀的速度,其思路是讓主數(shù)據(jù)庫(kù)(master)處理事務(wù)性增、改、刪操作(INSERT、UPDATE、DELETE),而從數(shù)據(jù)庫(kù)(slave)處理SELECT查詢操作,下面是淘寶最早的時(shí)候采用的讀寫分離策略:

面對(duì)峰值響應(yīng)沖擊,解決高并發(fā)的三大策略

 

讀寫分離示意圖

2、DB Cluster

集群就不再做過(guò)多說(shuō)明,數(shù)據(jù)庫(kù)集群是利用至少兩臺(tái)或者多臺(tái)數(shù)據(jù)庫(kù)服務(wù)器,構(gòu)成一個(gè)虛擬單一數(shù)據(jù)庫(kù)邏輯映像,像單數(shù)據(jù)庫(kù)系統(tǒng)那樣,向客戶端提供透明的數(shù)據(jù)服務(wù)。其目的還是為了增加數(shù)據(jù)吞吐量,提高數(shù)據(jù)庫(kù)性能,滿足大數(shù)據(jù)量下對(duì)數(shù)據(jù)的讀寫速度要求。

阿里云的RDS云數(shù)據(jù)庫(kù)就繼承了上述2大特征,外面看來(lái)是一個(gè)MySQL集群,提供統(tǒng)一的透明訪問(wèn),而在內(nèi)部就自動(dòng)實(shí)現(xiàn)了讀寫分離,為高性能數(shù)據(jù)庫(kù)存儲(chǔ)提供了很大便利。

3、分布式存儲(chǔ)(DAS/NAS/SAN)

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

4、Cache

緩存無(wú)處不在,連CPU都有二級(jí)緩存,在數(shù)據(jù)訪問(wèn)這一層,可以根據(jù)你的數(shù)據(jù)需要充分利用緩存技術(shù)來(lái)提供讀寫速度,比如對(duì)要求不是特別實(shí)時(shí)的大數(shù)據(jù)進(jìn)行預(yù)統(tǒng)計(jì)分析,然后緩存下來(lái)做報(bào)表等,這個(gè)時(shí)候直接從緩存里讀取即可,提高統(tǒng)計(jì)速度。

5、NoSQL,Key/Value

NoSQL,泛指非關(guān)系型的數(shù)據(jù)庫(kù)。隨著互聯(lián)網(wǎng)Web2.0網(wǎng)站的興起,傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)在應(yīng)付Web2.0網(wǎng)站已經(jīng)顯得力不從心,暴露了很多難以克服的問(wèn)題,而非關(guān)系型的數(shù)據(jù)庫(kù)則由于其自身的特點(diǎn)(高可擴(kuò)展性、分布式計(jì)算、低成本、架構(gòu)的靈活性、半結(jié)構(gòu)化數(shù)據(jù),沒(méi)有復(fù)雜的關(guān)系)得到了非常迅速的發(fā)展。NoSQL數(shù)據(jù)庫(kù)的產(chǎn)生就是為了解決大規(guī)模數(shù)據(jù)集合多重?cái)?shù)據(jù)種類帶來(lái)的挑戰(zhàn),尤其是大數(shù)據(jù)應(yīng)用難題。其數(shù)據(jù)庫(kù)類型有列存儲(chǔ)、文檔存儲(chǔ)、Key/Value存儲(chǔ)、對(duì)象存儲(chǔ)和圖存儲(chǔ)等。

6、Split/分割,Partition/分區(qū)

表分區(qū)是DB對(duì)于非常大的表進(jìn)行優(yōu)化的一種有效方法,是根據(jù)數(shù)據(jù)庫(kù)定義不同的分區(qū)策略決定的,比如取模、時(shí)間和哈希等,是非常有效的一種手段,在很多情況下比表分割更有效。

比如,有一個(gè)代碼表使用分區(qū)表把100萬(wàn)紀(jì)錄分在10個(gè)分區(qū)中(ID每從1到10萬(wàn)為一個(gè)分區(qū)),那樣寫查詢語(yǔ)句的時(shí)候,只要給出查詢條件中所需要的代碼,DB自動(dòng)會(huì)定位到對(duì)應(yīng)的分區(qū)進(jìn)行查詢,大大降低的查詢時(shí)間。

而采用表分割那必須先根據(jù)查詢的代碼指定所要查詢的表,才能找到相應(yīng)的記錄,是由DBA或架構(gòu)師根據(jù)業(yè)務(wù)需要來(lái)定義如何分割的。表分割分為水平分割和垂直分割:

  • 水平分割: 根據(jù)一列或多列數(shù)據(jù)的值把數(shù)據(jù)行放到兩個(gè)獨(dú)立的表中;

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

7、BGP

邊界網(wǎng)關(guān)協(xié)議,主要用于互聯(lián)網(wǎng)AS(自治系統(tǒng))之間的互聯(lián),BGP的最主要功能在于控制路由的傳播和選擇最好的路由。中國(guó)網(wǎng)通與中國(guó)電信都具有AS號(hào)(自治系統(tǒng)號(hào)),全國(guó)各大網(wǎng)絡(luò)運(yùn)營(yíng)商多數(shù)都是通過(guò)BGP協(xié)議與自身的AS號(hào)來(lái)互聯(lián)的。

使用此方案來(lái)實(shí)現(xiàn)雙線路需要在CNNIC(中國(guó)互聯(lián)網(wǎng)信息中心)申請(qǐng)IDC自己的IP地址段和AS號(hào),然后通過(guò)BGP協(xié)議將此段IP地址廣播到移動(dòng),網(wǎng)通、電信等其它的網(wǎng)絡(luò)運(yùn)營(yíng)商,使用BGP協(xié)議互聯(lián)后移動(dòng)。網(wǎng)通與電信的所有骨干路由設(shè)備將會(huì)判斷到IDC機(jī)房IP段的最佳路由,以保證移動(dòng)、網(wǎng)通和電信用戶的高速訪問(wèn)?,F(xiàn)在不少的云平臺(tái)都支持BGP。

五、總結(jié)

“緩存”、“異步”和“分”是互聯(lián)網(wǎng)大數(shù)據(jù)量高并發(fā)下架構(gòu)策略中用的最多的3種策略,從上面各個(gè)技術(shù)層面,“分”也是占據(jù)了大多數(shù)技術(shù)的核心思想,所以考慮的時(shí)候要多想想分哪里、如何分,另外很多業(yè)務(wù)場(chǎng)景還得想想怎么合。

順便在此給大家推薦一個(gè)Java架構(gòu)方面的交流學(xué)習(xí)群: 698581634 ,里面會(huì)分享一些資深架構(gòu)師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發(fā)、高性能、分布式、微服務(wù)架構(gòu)的原理,JVM性能優(yōu)化這些成為架構(gòu)師必備的知識(shí)體系,主要針對(duì)Java開發(fā)人員提升自己,突破瓶頸,相信你來(lái)學(xué)習(xí),會(huì)有提升和收獲。在這個(gè)群里會(huì)有你需要的內(nèi)容  朋友們請(qǐng)抓緊時(shí)間加入進(jìn)來(lái)吧。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI