摘要:?1、當(dāng)服務(wù)量大到一定程度,流量扛不住的時(shí)候,該如何處理? 2、應(yīng)用之間相互依賴,當(dāng)應(yīng)用A出現(xiàn)響應(yīng)時(shí)間過長(zhǎng),影響到應(yīng)用B的響應(yīng),進(jìn)而產(chǎn)生連鎖反應(yīng)影響整個(gè)依賴鏈上的所有應(yīng)用,該如何處理?
隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來越重要。Sentinel以流量為切入點(diǎn),從流量控制、熔斷降級(jí)、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性。Sentinel 作為阿里巴巴“大中臺(tái)、小前臺(tái)”架構(gòu)中的基礎(chǔ)模塊,覆蓋了阿里的所有核心場(chǎng)景,也因此積累了大量的流量歸整場(chǎng)景以及生產(chǎn)實(shí)踐。
在近期的Aliware Open Source?深圳站-Apache Dubbo & ApacheRocketMQ開發(fā)者沙龍上,阿里巴巴中間件高級(jí)技術(shù)專家 子矜 宣布將Sentinel 進(jìn)行開源,并發(fā)布了首個(gè)社區(qū)版本v0.1.0,以下是根據(jù)子矜的現(xiàn)場(chǎng)分享所整理,為大家回顧分享中的精彩內(nèi)容。
分享嘉賓介紹:
林佳梁(子矜),阿里巴巴中間件高級(jí)技術(shù)專家,參與阿里巴巴多年雙十一大促,對(duì)流量的管控、高可用架構(gòu)有著豐富的經(jīng)驗(yàn),目前負(fù)責(zé)流量管控軟件Sentinel的開發(fā)和商業(yè)化。
一、Sentinel 的產(chǎn)生背景
在過去的 10 多年里,阿里巴巴投入了集團(tuán)大量的精英人力用于提升淘寶、天貓平臺(tái)服務(wù)的穩(wěn)定性,正是有了多年來上萬名阿里技術(shù)人才的持續(xù)創(chuàng)新和技術(shù)沉淀,在一系列秒殺大促中,特別是雙11 這樣現(xiàn)象級(jí)的電商大促中,才打造出了今天大家所看到的可輕松應(yīng)對(duì)雙11的平臺(tái)穩(wěn)定性體系,包括限流和降級(jí)、流量調(diào)度、業(yè)務(wù)開關(guān)、容量壓測(cè)和評(píng)估、全鏈路壓測(cè)、業(yè)務(wù)一致性平臺(tái)等,而Sentinel正是在這種背景下產(chǎn)生的限流降級(jí)框架,目前已接入集團(tuán)幾乎所有的核心應(yīng)用。
二、Sentinal 可以解決什么問題?
? 限流:
當(dāng)我們?cè)O(shè)計(jì)了一個(gè)函數(shù),準(zhǔn)備上線,這時(shí)候這個(gè)函數(shù)會(huì)消耗一些資源,處理上限是1秒服務(wù)3000個(gè)QPS,但如果實(shí)際情況遇到高于3000的QPS該如何解決呢?Sentinel提供了兩種流量統(tǒng)計(jì)方式,一種是統(tǒng)計(jì)并發(fā)線程數(shù),另外一種則是統(tǒng)計(jì) QPS,當(dāng)并發(fā)線程數(shù)超出某個(gè)設(shè)定的閥值,新的請(qǐng)求會(huì)被立即拒絕,當(dāng)QPS超出某個(gè)設(shè)定的閥值,系統(tǒng)可以通過直接拒絕、冷啟動(dòng)、勻速器三種方式來應(yīng)對(duì),從而起流量控制的作用。
? 熔斷降級(jí):
接觸過Spring Cloud、Service Mesh的同學(xué),都知道熔斷降級(jí)的概念。服務(wù)之間會(huì)有相互依賴關(guān)系,例如服務(wù)A做到了1秒上萬個(gè)QPS,但這時(shí)候服務(wù)B并無法滿足1秒上萬個(gè)QPS,那么如何保證服務(wù)A在高頻調(diào)用服務(wù)B時(shí),服務(wù)B仍能正常工作呢?一種比較常見的情況是,服務(wù)A調(diào)用服務(wù)B時(shí),服務(wù)B因無法滿足高頻調(diào)用出現(xiàn)響應(yīng)時(shí)間過長(zhǎng)的情況,導(dǎo)致服務(wù)A也出現(xiàn)響應(yīng)過長(zhǎng)的情況,進(jìn)而產(chǎn)生連鎖反應(yīng)影響整個(gè)依賴鏈上的所有應(yīng)用,這時(shí)候就需要熔斷和降級(jí)的方法。Sentinel通過并發(fā)線程數(shù)進(jìn)行限制和響應(yīng)時(shí)間對(duì)資源進(jìn)行降級(jí)兩種手段來對(duì)服務(wù)進(jìn)行熔斷或降級(jí)。
? 塑形
通常我們遇到的流量具有隨機(jī)性、不規(guī)則、不受控的特點(diǎn),但系統(tǒng)的處理能力往往是有限的,我們需要根據(jù)系統(tǒng)的處理能力對(duì)流量進(jìn)行塑形,即規(guī)則化,從而根據(jù)我們的需要來處理流量。Sentinel通過資源的調(diào)用關(guān)系、運(yùn)行指標(biāo)、控制的效果三個(gè)維度來對(duì)流量進(jìn)行控制,開發(fā)者可以自行靈活組合,從而達(dá)到理想的效果。
? 系統(tǒng)負(fù)載保護(hù)
平時(shí)系統(tǒng)運(yùn)行都沒問題,但遇到大促的時(shí)候,發(fā)現(xiàn)機(jī)器的load非常高,這時(shí)候?qū)ο到y(tǒng)的負(fù)載保護(hù)就顯得非常重要,以防止雪崩。Sentinel 提供了對(duì)應(yīng)的保護(hù)機(jī)制,讓系統(tǒng)的入口流量和系統(tǒng)的負(fù)載達(dá)到一個(gè)平衡,保證系統(tǒng)在能力范圍之內(nèi)處理最多的請(qǐng)求。需要注意的是,Sentinel在系統(tǒng)負(fù)載保護(hù)方面的判斷機(jī)制是根據(jù)系統(tǒng)能夠處理的請(qǐng)求,和允許進(jìn)來的請(qǐng)求,來做平衡,而不是根據(jù)一個(gè)間接的指標(biāo)(系統(tǒng)load)來做限流。因?yàn)槲覀冏罱K追求的目標(biāo)是在系統(tǒng)不被拖垮的情況下,提高系統(tǒng)的吞吐率,而不是load一定要到低于某個(gè)閥值。
三、一個(gè)好的流量管理框架應(yīng)該具備哪些特點(diǎn)?
? 輕巧
輕巧指的是對(duì)性能影響小和對(duì)應(yīng)用零入侵。
限流框架是寄宿在應(yīng)用上的,這時(shí)候要求限流框架不能對(duì)系統(tǒng)資源有過多的消耗。就像汽車上的安全氣囊如果會(huì)耗油、導(dǎo)致汽車跑得慢,這就不是一個(gè)好氣囊,Sentinel的接入對(duì)系統(tǒng)資源的消耗極少。
除了對(duì)性能的影響要優(yōu)化到最低以外,還有一個(gè)特征,就是需要保證他對(duì)應(yīng)用的零入侵。零入侵是讓開發(fā)者幾乎意識(shí)不到這個(gè)框架的存在。如果讓開發(fā)者一邊開發(fā),一邊還要想著限流降級(jí),這就非常累了。優(yōu)秀的限流就像是汽車上的安全氣囊,平時(shí)系統(tǒng)工作正常的時(shí)候我們感受不到他的存在,只有當(dāng)系統(tǒng)出現(xiàn)無法應(yīng)對(duì)當(dāng)前流量的時(shí)候,才會(huì)出現(xiàn),這就是對(duì)應(yīng)用零入侵的體現(xiàn),開發(fā)者無需關(guān)心如何接入流量框架,便可調(diào)用服務(wù)。
對(duì)此,Sentinel通過對(duì)主流框架,例如Dubbo、Spring Cloud, grpc等,進(jìn)行默認(rèn)適配,只要接入我們的適配器,默認(rèn)的資源就都有了;如果不是用主流框架,也沒有關(guān)系,只需要很簡(jiǎn)單,差不多3步,就可以接入,之后還會(huì)提供annotation,讓用戶更簡(jiǎn)單的用起來。
? 專業(yè)
不同的場(chǎng)景下有不同的限流需求。在什么時(shí)候減流量,流量減多了影響用戶體驗(yàn)、流量減少了影響系統(tǒng)穩(wěn)定性,陡峭高峰如何限流、銷峰填谷如何限流,這里就涉及到限流的算法。不同于 hystrix 只提供一兩個(gè)維度的限流方式,Sentinel提供了一個(gè)靈活的框架,從不同的維度出發(fā),開發(fā)者可以根據(jù)自身的場(chǎng)景去制定自己的限流策略。
? 實(shí)時(shí)監(jiān)控
流量具有很強(qiáng)的實(shí)時(shí)性,之所以需要限流,是因?yàn)槲覀儫o法對(duì)流量的到來作出精確的預(yù)判,不然的話我們完全可以通過彈性的計(jì)算資源來處理,所以這時(shí)候限流框架的實(shí)時(shí)監(jiān)控功能就非常重要了。通過Sentinel的實(shí)時(shí)監(jiān)控功能,運(yùn)維人員可以根據(jù)實(shí)際流量情況,采取不同的措施,限流、降級(jí)、塑形、系統(tǒng)保護(hù),所以在我們第一版開源版本中,我們加入了Sentinel的控制臺(tái),具備實(shí)時(shí)監(jiān)控功能。
四、Sentinal 的最佳實(shí)踐
? Dubbo service
我們已經(jīng)把 Sentinel 的適配器捐給了Dubbo,社區(qū)傳送門
如果開發(fā)者接入了Dubbo Sentinel,就能立即實(shí)現(xiàn)實(shí)時(shí)秒級(jí)監(jiān)控的功能。這個(gè)監(jiān)控提供單機(jī)鏈路維度和單機(jī)平鋪維度,還提供匯總維度的監(jiān)控。非常方便。
然后我們?cè)賮砜碨entinel還帶來了什么好處。當(dāng)我們?yōu)g覽一件商品時(shí),背后可能應(yīng)對(duì)著上百個(gè)服務(wù),例如商品屬性、商品庫存、個(gè)人信息、評(píng)價(jià)信息、店鋪信息、商品優(yōu)惠、訂單信息、交易信息、推薦信息等等,這類場(chǎng)景,我們可以由兩個(gè)維度來看Sentinel在Dubbo service 中的實(shí)踐,一個(gè)是從服務(wù)提供方service provider如何限流,例如在百個(gè)服務(wù)中要保證交易服務(wù)可以正常處理,那就可以通過容量或者并發(fā)量來限流。一個(gè)是從服務(wù)調(diào)用方service caller如何限流,則可以通過熔斷降級(jí)來限流。
? RocketMQ客戶端 & RocketMQ服務(wù)端
圖中紅色曲線是表示實(shí)際的消息流量,紅色區(qū)域是超出我們處理能力的消息流量,這時(shí)候借助Sentinel對(duì)流量實(shí)施削峰填谷,把紅色流量放到系統(tǒng)不太繁忙的時(shí)候再來處理,這樣既不會(huì)丟失流量的請(qǐng)求,也不會(huì)對(duì)用戶的購(gòu)物體驗(yàn)產(chǎn)生影響。這類處理在電商的訂單處理等環(huán)節(jié)很常見。在RocketMQ的服務(wù)端,消息的分發(fā)者則可以通過Sentinel勻速的對(duì)外發(fā)送請(qǐng)求。
這個(gè)最佳實(shí)踐,我們也捐給了Apache RocketMQ,目前正在合并,大家很快就可以看到。
? Nacos
Sentinel和Nacos類似,是以Dubbo大生態(tài)中的核心組件的身份來對(duì)外開源的,目的是幫助開發(fā)者獲得更完整的分布式服務(wù)解決方案。例如當(dāng)我們限流的流量發(fā)生變化的時(shí)候,我們需要迅速推規(guī)則的時(shí)候,Sentinel可以和Nacos相互整合,起到快速操作、快速配送的效果。
Sentinel的理念是無縫對(duì)接Dubbo大生態(tài),和Dubbo、Nacos等阿里中間件開源產(chǎn)品緊密結(jié)合,支持一鍵使用,并且全面擁抱開源生態(tài),例如會(huì)對(duì)grpc ,Rest Service主流框架進(jìn)行積極適配并開放出來,同時(shí)提供一系列API給到開發(fā)者,用于定制自己的需求。
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
評(píng)論
查看更多