網(wǎng)站建設(shè)的結(jié)論和體會百度推廣營銷中心
目錄
1.限流
2.緩存
2.1.緩存的使用場景
3.降級
3.1.什么是降級?
3.2.服務(wù)降級方式
4.其他高并發(fā)手段?
4.1. 集群
4.2.拆分
4.2.1 應(yīng)用拆分
4.2.2 數(shù)據(jù)庫
4.3. 靜態(tài)化
4.4.削峰
4.5.限流
5.總結(jié)
參考
保護(hù)高并發(fā)系統(tǒng)的三大利器:限流、熔斷降級、緩存
- 限流:控制系統(tǒng)的請求量,防止系統(tǒng)被過度壓力而崩潰。
- 緩存:將一些常用的數(shù)據(jù)存儲在內(nèi)存中,減輕數(shù)據(jù)庫的壓力,提高系統(tǒng)的響應(yīng)速度。
- 降級:當(dāng)系統(tǒng)不能承受更多的請求時,可以有意識地關(guān)閉一些不必要的功能或服務(wù),以保證核心功能的正常運(yùn)行。
1.限流
????????限流是保護(hù)高并發(fā)系統(tǒng)的三把利器之一。限流在很多場景中用來限制并發(fā)和請求量。實現(xiàn)系統(tǒng)限流的方式有很多種,比如令牌桶算法、漏桶算法等。
采用限流策略來控制用戶的請求速率
限流常用的幾種算法
1)計數(shù)器限流
你要是仔細(xì)看了上面的內(nèi)容,就會發(fā)現(xiàn)上面舉例的每秒閾值1000的那個例子就是一個計數(shù)器限流的思想,計數(shù)器限流的本質(zhì)是一定時間內(nèi),訪問量到達(dá)設(shè)置的限制后,在這個時間段沒有過去之前,超過閾值的訪問量拒絕處理,舉個例,你告訴老板我一個小時只處理10件事,這是你的處理能力,但領(lǐng)導(dǎo)半個小內(nèi)就斷續(xù)斷續(xù)給你分派了10件事,這時已經(jīng)到達(dá)你的極限了,在后面的半個小時內(nèi),領(lǐng)導(dǎo)再派出的活你是拒絕處理的,直到下一個小時的時間段開始。
2)漏斗限流
漏斗限流,意思是說在一個漏斗容器中,當(dāng)請求來臨時就從漏斗頂部放入,漏斗底部會以一定的頻率流出,當(dāng)放入的速度大于流出的速度時,漏斗的空間會逐漸減少為0,這時請求會被拒絕,其實就是上面開始時池塘流水的例子。流入速率是隨機(jī)的,流出速率是固定的,當(dāng)漏斗滿了之后,其實到了一個平滑的階段,因為流出是固定的,所以你流入也是固定的,相當(dāng)于請求是勻速通過的
2.緩存
2.1.緩存的使用場景
-
經(jīng)常需要讀取的數(shù)據(jù)
-
頻繁訪問的數(shù)據(jù)
-
熱點(diǎn)數(shù)據(jù)緩存
-
IO 瓶頸數(shù)據(jù)
-
計算昂貴的數(shù)據(jù)
-
無需實時更新的數(shù)據(jù)
-
緩存的目的是減少對后端服務(wù)的訪問,降低后端服務(wù)的壓力
?1)CDN 緩存
-
CDN
?的全稱是?Content Delivery Network
,即內(nèi)容分發(fā)網(wǎng)絡(luò)。CDN
?是構(gòu)建在網(wǎng)絡(luò)之上的內(nèi)容分發(fā)網(wǎng)絡(luò),依靠部署在各地的邊緣服務(wù)器,通過中心平臺的負(fù)載均衡、內(nèi)容分發(fā)、調(diào)度等功能模塊,使用戶就近獲取所需內(nèi)容,降低網(wǎng)絡(luò)擁塞,提高用戶訪問響應(yīng)速度和命中率。CDN
的關(guān)鍵技術(shù)主要有內(nèi)容存儲和分發(fā)技術(shù)。 -
CDN
?它本身也是一個緩存,它把后端應(yīng)用的數(shù)據(jù)緩存起來,用戶要訪問的時候,直接從CDN
?上獲取,不需要走后端的?Nginx
,以及具體應(yīng)用服務(wù)器?Tomcat
,它的作用主要是加速數(shù)據(jù)的傳輸,也提高穩(wěn)定性,如果從?CDN
?上沒有獲取到數(shù)據(jù),再走后端的Nginx
緩存,Nginx
?上也沒有,則走后端的應(yīng)用服務(wù)器,CDN
主要緩存靜態(tài)資
2)應(yīng)用緩存:
????????內(nèi)存緩存
????????????????在內(nèi)存中緩存數(shù)據(jù),效率高,速度快,應(yīng)用重啟緩存丟失
????????磁盤緩存
????????????????在磁盤緩存數(shù)據(jù),讀取效率跟內(nèi)存比較,磁盤緩存稍低,但應(yīng)用重啟緩存不會丟失3)
3)多級緩存
在整個應(yīng)用系統(tǒng)的不同層級進(jìn)行數(shù)據(jù)的緩存,多層次緩存,來提升訪問效率;比如:瀏覽器 -> CDN -> Nginx -> Redis -> DB (磁盤、文件系統(tǒng))
隨著業(yè)務(wù)的不斷增加,服務(wù)器性能很快又到達(dá)瓶頸
3.降級
降級的最終目的是保證核心服務(wù)可用,即使是有損的。而且有些服務(wù)是無法降級的
3.1.什么是降級?
服務(wù)降級是當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)當(dāng)前業(yè)務(wù)情況及流量對一些服務(wù)和頁面有策略的降級,以此釋放服務(wù)器資源以保證核心任務(wù)的正常運(yùn)行。
3.2.服務(wù)降級方式
延遲服務(wù):定時任務(wù)處理、或者mq延時處理。
頁面降級:頁面點(diǎn)擊按鈕全部置灰,或者頁面調(diào)整成為一個靜態(tài)頁面顯示"系統(tǒng)正在維護(hù)中......"。
關(guān)閉非核心服務(wù):比如電商關(guān)閉推薦服務(wù)、關(guān)閉運(yùn)費(fèi)險、退貨退款等。保證主流程的核心服務(wù)下單付款就好。
寫降級:比如秒殺搶購,我們可以只進(jìn)行Cache的更新返回,然后通過mq異步扣減庫存到DB,保證最終一致性即可,此時可以將DB降級為Cache。
讀降級:比如多級緩存模式,如果后端服務(wù)有問題,可以降級為只讀緩存
4.其他高并發(fā)手段?
4.1. 集群
-
有一個單體應(yīng)用,當(dāng)訪問流量很大無法支撐,那么可以集群部署,也叫單體應(yīng)用「水平擴(kuò)容」,原來通過部署一臺服務(wù)器提供服務(wù),現(xiàn)在就多部署幾臺,那么服務(wù)的能力就會提升。
-
部署了多臺服務(wù)器,但是用戶訪問入口只能是一個,比如?
www.evanshare.com
,所以就需要?「負(fù)載均衡」,負(fù)載均衡是應(yīng)用集群擴(kuò)容后的必須步驟,集群部署后,用戶的會話?session
?狀態(tài) 要保持的話,就需要實現(xiàn)?session
?共享。
4.2.拆分
4.2.1 應(yīng)用拆分
應(yīng)用的拆分:分布式 (微服務(wù))
單體應(yīng)用,隨著業(yè)務(wù)的發(fā)展,應(yīng)用功能的增加,單體應(yīng)用就逐步變得非常龐大,很多人 維護(hù)這么一個系統(tǒng),開發(fā)、測試、上線都會造成很大問題,比如代碼沖突,代碼重復(fù),邏輯錯綜混亂,代碼邏輯復(fù)雜度增加,響應(yīng)新需求的速度降低,隱藏的風(fēng)險增大,所以需要按照?「業(yè)務(wù)維度進(jìn)行應(yīng)用拆分,采用分布式開發(fā)」;
應(yīng)用拆分之后,就將原來在同一進(jìn)程里的調(diào)用變成了遠(yuǎn)程方法調(diào)用,此時就需要使用到 一些「遠(yuǎn)程調(diào)用技」?httpClient
、hessian
、dubbo
、webservice
?等;
隨著業(yè)務(wù)復(fù)雜度增加,我們需要采用一些開源方案進(jìn)行開發(fā),提升開發(fā)和維護(hù)效率,比 如?Dubbo
、SpringCloud
;
通過應(yīng)用拆分之后,擴(kuò)容就變得容易,如果此時系統(tǒng)處理能力跟不上,只需要「增加服務(wù) 器即可」(把拆分后的每一個服務(wù)再多做幾個集群)
4.2.2 數(shù)據(jù)庫
1)數(shù)據(jù)庫拆分
數(shù)據(jù)庫拆分分為:「垂直拆分和水平拆分 (分庫分表)」
?「按照業(yè)務(wù)維度把相同類型的表放在一個數(shù)據(jù)庫,另一些表放在另一個數(shù)據(jù)庫」,這種方式 的拆分叫「垂直拆分」,也就是在 不同庫建不同表,把表分散到各個數(shù)據(jù)庫
比如產(chǎn)品、訂單、用戶三類數(shù)據(jù)以前在一個數(shù)據(jù)庫中,現(xiàn)在可以用三個數(shù)據(jù)庫,分別為?「產(chǎn)品數(shù)據(jù)庫、訂單數(shù)據(jù)庫、用戶數(shù)據(jù)庫」,這樣可以將不同的數(shù)據(jù)庫部署在不同的服務(wù)器上,提升單機(jī)容量和性能問題,也解決多 個表之間的 IO 競爭問題
根據(jù)數(shù)據(jù)行的特點(diǎn)和規(guī)則,將表中的「某些行切分到一個數(shù)據(jù)庫,而另外的某些行又切分 到另一個數(shù)據(jù)庫」,這種方式的拆分叫「水平拆分」
單庫單表在數(shù)據(jù)量和流量增大的過程中,大表往往會成為性能瓶頸,所以數(shù)據(jù)庫要進(jìn)行「水平拆分」
2)讀寫分離 + 主從復(fù)制
3)數(shù)據(jù)庫優(yōu)化
4.3. 靜態(tài)化
對于一些訪問量大,更新頻率較低的數(shù)據(jù),可直接定時生成靜態(tài) html 頁面,供前端訪問,而不是訪問 jsp
常用靜態(tài)化的技術(shù):freemaker
、velocity
?定時任務(wù),每隔 2 分鐘生成一次首頁的靜態(tài)化頁面
頁面靜態(tài)化首先可以大大提升訪問速度,不需要去訪問數(shù)據(jù)庫或者緩存來獲取數(shù)據(jù),瀏覽器直接加載?html
?頁即可
頁面靜態(tài)化可以提升網(wǎng)站穩(wěn)定性,如果程序或數(shù)據(jù)庫出了問題,靜態(tài)頁面依然可以正常 訪問
4.4.削峰
???削峰本質(zhì)上是更多地延緩用戶請求,層層過濾用戶的訪問需求,遵從“最后落地到數(shù)據(jù)庫的請求數(shù)要盡量少”的原則
-
限流算法:通過限制單位時間內(nèi)請求的數(shù)量或速率,來控制訪問流量。常見的限流算法包括令牌桶算法和漏桶算法。
-
緩存:將一部分?jǐn)?shù)據(jù)緩存在內(nèi)存中,減少對數(shù)據(jù)庫的訪問次數(shù),從而降低服務(wù)器壓力。
-
負(fù)載均衡:將訪問流量分散到多臺服務(wù)器上,避免單一服務(wù)器過載,提高系統(tǒng)的可用性和穩(wěn)定性。
-
異步處理:將一些耗時的操作異步處理,如發(fā)送郵件、生成報表等,避免阻塞主線程,提高系統(tǒng)的并發(fā)能力。
-
CDN加速:通過將靜態(tài)資源緩存在CDN節(jié)點(diǎn)上,加速用戶對靜態(tài)資源的訪問,降低服務(wù)器壓力
4.5.限流
? ? ? ? 通過削峰策略來平衡供需,從而保證系統(tǒng)的正常運(yùn)行
???????像漏斗一樣,盡量把數(shù)據(jù)量和請求量一層一層地過濾和減少,需要查詢的用戶,在緩存中能能查詢到需要的信息,無需通過每次查詢數(shù)據(jù)庫,那么最后留下的,就是真正需要成交的客戶,大大減輕DB的讀寫壓力
1)分層過濾的核心思想
- ?通過在不同的層次盡可能地過濾掉無效請求。
- ?通過CDN過濾掉大量的圖片,靜態(tài)資源的請求。
- ?再通過類似Redis這樣的分布式緩存,過濾請求等就是典型的在上游攔截讀請求。
2)分層過濾的基本原則
- ?對寫數(shù)據(jù)進(jìn)行基于時間的合理分片,過濾掉過期的失效請求。
- ?對寫請求做限流保護(hù),將超出系統(tǒng)承載能力的請求過濾掉。
- ?涉及到的讀數(shù)據(jù)不做強(qiáng)一致性校驗,減少因為一致性校驗產(chǎn)生瓶頸的問題。
- ?對寫數(shù)據(jù)進(jìn)行強(qiáng)一致性校驗,只保留最后有效的數(shù)據(jù)。
????????最終,讓“漏斗”最末端(數(shù)據(jù)庫)的才是有效請求。例如:當(dāng)用戶真實達(dá)到訂單和支付的流程,這個是需要數(shù)據(jù)強(qiáng)一致性的。
5.總結(jié)
高并發(fā)(High Concurrency)是互聯(lián)網(wǎng)分布式系統(tǒng)架構(gòu)設(shè)計中必須考慮的因素之一。
提高系統(tǒng)并發(fā)能力的方式,方法論上主要有兩種:垂直擴(kuò)展(Scale Up)與水平擴(kuò)展(Scale Out)。前者垂直擴(kuò)展可以通過提升單機(jī)硬件性能,或者提升單機(jī)架構(gòu)性能,來提高并發(fā)性,但單機(jī)性能總是有極限的,互聯(lián)網(wǎng)分布式架構(gòu)設(shè)計高并發(fā)終極解決方案還是后者:水平擴(kuò)展。
同時結(jié)合一些策略達(dá)到分流、限流的目的
1.對于秒殺這樣的高并發(fā)場景業(yè)務(wù),最基本的原則就是將請求攔截在系統(tǒng)上游,降低下游壓力。如果不在前端攔截很可能造成數(shù)據(jù)庫(mysql、oracle等)讀寫鎖沖突,甚至導(dǎo)致死鎖,最終還有可能出現(xiàn)雪崩等場景。
2.劃分好動靜資源,靜態(tài)資源使用CDN進(jìn)行服務(wù)分發(fā)。
3.充分利用緩存(redis等):增加QPS,從而加大整個集群的吞吐量。
4.高峰值流量是壓垮系統(tǒng)很重要的原因,所以需要RocketMQ消息隊列在一端承接瞬時的流量洪峰,在另一端平滑地將消息推送出去。
以上,為個人工作之余一些淺薄看法,記錄下來,與諸位共享,不足之處,多多指點(diǎn),感激不盡
參考
[1]高并發(fā)場景,你要如何實現(xiàn)系統(tǒng)限流?
[2]分布式高并發(fā)服務(wù)三種常用限流方案簡介
[3]?九師兄的博客 - 高并發(fā)之限流 RateLimiter使用