|
在復(fù)雜的生產(chǎn)環(huán)境下可能部署著成千上萬(wàn)的服務(wù)實(shí)例,當(dāng)流量持續(xù)不斷地涌入,服務(wù)之間相互調(diào)用頻率陡增時(shí),會(huì)產(chǎn)生系統(tǒng)負(fù)載過(guò)高、網(wǎng)絡(luò)延遲等一系列問(wèn)題,從而導(dǎo)致某些服務(wù)不可用。如果不進(jìn)行相應(yīng)的流量控制,可能會(huì)導(dǎo)致級(jí)聯(lián)故障,并影響到服務(wù)的可用性,因此如何對(duì)高流量進(jìn)行合理控制,成為保障服務(wù)穩(wěn)定性的關(guān)鍵。 阿里巴巴中間件團(tuán)隊(duì)在上周的Aliware Open Source 深圳站的活動(dòng)上,宣布對(duì)Sentinel開源,并在社區(qū)發(fā)布了首個(gè)開源版本v0.1.0。Sentinel是面向分布式服務(wù)架構(gòu)的輕量級(jí)限流降級(jí)框架,以流量為切入點(diǎn),從流量控制、熔斷降級(jí)和系統(tǒng)負(fù)載保護(hù)等多個(gè)維度來(lái)幫助用戶保障服務(wù)的穩(wěn)定性。從本期開始,我們將圍繞Sentinel的使用場(chǎng)景、技術(shù)對(duì)比和實(shí)現(xiàn)、開發(fā)者實(shí)踐等維度推出系列文章。本文將基于Dubbo的服務(wù)框架,看看Sentinel 是如何對(duì)高流量進(jìn)行限流的。 一、Dubbo 一鍵接入 Sentinel Sentinel 意為哨兵,這個(gè)命名形象的詮釋了Sentinel在分布式系統(tǒng)中的工作角色和重要性。 以 Sentinel 在Dubbo 生態(tài)系統(tǒng)中的作用為例,Dubbo服務(wù)框架的核心模塊包括注冊(cè)中心、服務(wù)提供方、服務(wù)消費(fèi)方(服務(wù)調(diào)用方)和監(jiān)控4個(gè)模塊。Sentinel通過(guò)對(duì)服務(wù)提供方和服務(wù)消費(fèi)方的限流來(lái)進(jìn)一步提升服務(wù)的可用性。接下來(lái)我們看看Sentinel對(duì)服務(wù)提供方和服務(wù)消費(fèi)方限流的技術(shù)實(shí)現(xiàn)方式。 Sentinel 提供了與 Dubbo 適配的模塊 – Sentinel Dubbo Adapter,包括針對(duì)服務(wù)提供方的過(guò)濾器和服務(wù)消費(fèi)方的過(guò)濾器。使用時(shí)用戶只需引入相關(guān)模塊,Dubbo的服務(wù)接口和方法(包括調(diào)用端和服務(wù)端)就會(huì)成為 Sentinel 中的資源,在配置了規(guī)則后就可以自動(dòng)享受到 Sentinel 的防護(hù)能力。同時(shí)提供了靈活的配置選項(xiàng),例如若不希望開啟Sentinel Dubbo Adapter中的某個(gè)Filter,可以手動(dòng)關(guān)閉對(duì)應(yīng)的Filter。 二、限流必備 - 監(jiān)控管理 流量具有很強(qiáng)的實(shí)時(shí)性,之所以需要限流,是因?yàn)槲覀儫o(wú)法對(duì)流量的到來(lái)作出精確的預(yù)判,不然的話我們完全可以通過(guò)彈性的計(jì)算資源來(lái)處理,所以這時(shí)候?yàn)榱吮WC限流的準(zhǔn)確性,限流框架的監(jiān)控功能就非常重要了。 Sentinel的控制臺(tái)(Dashboard)是流量控制、熔斷降級(jí)規(guī)則統(tǒng)一配置和管理的入口,同時(shí)它為用戶提供了多個(gè)維度的監(jiān)控功能。在Sentinel控制臺(tái)上,我們可以配置規(guī)則并實(shí)時(shí)查看流量控制效果。 ? 單臺(tái)設(shè)備監(jiān)控 當(dāng)在機(jī)器列表中看到您的機(jī)器,就代表著已經(jīng)成功接入控制臺(tái),可以查看單臺(tái)設(shè)備的設(shè)備名稱、IP地址、端口號(hào)、健康狀態(tài)和心跳時(shí)間等信息。 ? 鏈路監(jiān)控 簇點(diǎn)鏈路實(shí)時(shí)的去拉取指定客戶端資源的運(yùn)行情況,它提供了兩種展示模式,一種用書狀結(jié)構(gòu)展示資源的調(diào)用鏈路;另外一種則不區(qū)分調(diào)用鏈路展示資源的運(yùn)行情況。通過(guò)鏈路監(jiān)控,可以查看到每個(gè)資源的流控和降級(jí)的歷史狀態(tài)。 ? 聚合監(jiān)控同一個(gè)服務(wù)下的所有機(jī)器的簇點(diǎn)信息會(huì)被匯總,實(shí)現(xiàn)實(shí)時(shí)監(jiān)控,精確度達(dá)秒級(jí)。 三、Sentinel 基于 Dubbo的最佳實(shí)踐 Dubbo 接入 Sentinel后,可通過(guò)對(duì)Dubbo核心模塊中的服務(wù)提供方和服務(wù)消費(fèi)方的限流來(lái)進(jìn)一步提升服務(wù)的可用性。 1、對(duì)服務(wù)提供方的限流 對(duì)服務(wù)提供方的限流可分為服務(wù)提供方的自我保護(hù)能力和服務(wù)提供方對(duì)服務(wù)消費(fèi)方的請(qǐng)求分配能力這兩個(gè)維度。 服務(wù)提供方用于向外界提供服務(wù),處理各個(gè)消費(fèi)方的調(diào)用請(qǐng)求。為了保護(hù)提供方不被激增的流量拖垮影響穩(wěn)定性,可以給提供方配置QPS模式的限流,這樣當(dāng)每秒的請(qǐng)求量超過(guò)設(shè)定的閾值時(shí)會(huì)自動(dòng)拒絕閾值外的請(qǐng)求。若希望整個(gè)服務(wù)接口的QPS不超過(guò)一定數(shù)值,則可以為對(duì)應(yīng)服務(wù)接口資源(resourceName為接口全限定名)配置QPS閾值;若希望對(duì)某個(gè)服務(wù)函數(shù)的QPS不超過(guò)一定數(shù)值,則可以為對(duì)這個(gè)服務(wù)函數(shù)資源(resourceName為接口全限定名:方法簽名)配置QPS閾值。 根據(jù)調(diào)用方的需求來(lái)分配服務(wù)提供方的處理能力也是常見的限流方式。比如有兩個(gè)服務(wù) A 和 B 都向 Service Provider 發(fā)起調(diào)用請(qǐng)求,我們希望只對(duì)來(lái)自服務(wù) B 的請(qǐng)求進(jìn)行限流,則可以設(shè)置限流規(guī)則的 limitApp 為服務(wù) B 的名稱。Sentinel Dubbo Adapter 會(huì)自動(dòng)解析 Dubbo 消費(fèi)方(調(diào)用方)的 application name 作為調(diào)用方名稱(origin),在進(jìn)行資源保護(hù)的時(shí)候都會(huì)帶上調(diào)用方名稱。若限流規(guī)則未配置調(diào)用方(default),則該限流規(guī)則對(duì)所有調(diào)用方生效。若限流規(guī)則配置了調(diào)用方則限流規(guī)則將僅對(duì)指定調(diào)用方生效。 2、對(duì)服務(wù)消費(fèi)方的限流 對(duì)服務(wù)提供方的限流可分為對(duì)控制并發(fā)線程數(shù),和服務(wù)降級(jí)兩個(gè)維度。 服務(wù)消費(fèi)方作為客戶端去調(diào)用遠(yuǎn)程服務(wù)。每一個(gè)服務(wù)都可能會(huì)依賴幾個(gè)下游服務(wù),若某個(gè)服務(wù)A依賴的下游服務(wù)B出現(xiàn)了不穩(wěn)定的情況,服務(wù)A請(qǐng)求服務(wù)B的響應(yīng)時(shí)間變長(zhǎng),從而服務(wù)A調(diào)服務(wù)B的線程就會(huì)產(chǎn)生堆積,最終可能耗盡服務(wù)A的線程數(shù)。我們通過(guò)用并發(fā)線程數(shù)來(lái)控制對(duì)下游服務(wù)B的訪問(wèn),來(lái)保證下游服務(wù)不可靠的時(shí)候,不會(huì)拖垮服務(wù)自身。采用基于線程數(shù)的限制模式后,我們不需要再去對(duì)線程池進(jìn)行隔離,Sentinel 會(huì)控制資源的線程數(shù),超出的請(qǐng)求直接拒絕,直到堆積的線程處理完成。限流粒度同樣可以是服務(wù)接口和服務(wù)方法兩種粒度。 我們看一下這種模式的效果。假設(shè)當(dāng)前服務(wù)A依賴兩個(gè)遠(yuǎn)程服務(wù)方法 sayHello(java.lang.String) 和 doAnother()。前者遠(yuǎn)程調(diào)用的響應(yīng)時(shí)間為1s-1.5s之間,后者RT非常?。?0 ms左右)。服務(wù)A端設(shè)兩個(gè)遠(yuǎn)程方法線程數(shù)為5,然后每隔50 ms左右向線程池投入兩個(gè)任務(wù),作為調(diào)用者分別遠(yuǎn)程調(diào)用對(duì)應(yīng)方法,持續(xù)10次。可以看到 sayHello 方法被限流5次,因?yàn)楹竺嬲{(diào)用的時(shí)候前面的遠(yuǎn)程調(diào)用還未返回(RT高);而 doAnother() 調(diào)用則不受影響。線程數(shù)目超出時(shí)快速失敗能夠有效地防止自己被調(diào)用所影響。 此外,當(dāng)調(diào)用鏈路中某個(gè)資源出現(xiàn)不穩(wěn)定的情況,如平均 RT 增高、異常比例升高的時(shí)候,Sentinel 會(huì)使對(duì)此調(diào)用資源進(jìn)行降級(jí)操作。 以上介紹的只是Sentinel的一個(gè)最簡(jiǎn)單的場(chǎng)景 – 限流,Sentinel還可以處理更復(fù)雜的場(chǎng)景,例如 請(qǐng)求勻速、超時(shí)熔斷、冷啟動(dòng) 等,下一期我們將分享如何借助Sentinel實(shí)現(xiàn)消息流轉(zhuǎn)場(chǎng)景下的請(qǐng)求勻速功能。 |
|
|