sentinel 时间窗口_Sentinel潜龙勿用篇
前言
我為什么寫這篇文章,是因為Sentinel實在是太強大太好用了,再加上阿里開源,Sentinel的發(fā)展迅猛。已有多家公司生產(chǎn)使用,但但凡神功,一個不慎,就有可能走火入魔,輕則離職走人,重則走火入魔踏上跑路生涯。本文本著你對官方秘籍已經(jīng)通篇閱讀無一不懂的前提,來此避坑,如無上述經(jīng)歷,請即刻返程回讀。
限流篇
為什么要使用Sentinel?
我們?yōu)槭裁匆阆蘖?#xff0c;限流的作用是什么在此不做贅述,但是在做限流前我們需要思考一個問題,為什么要用Sentinel,達到什么樣的流量需要采用限流,什么樣的應(yīng)用適合Sentinel。
新的中間件的應(yīng)用,尤其是這種作用在應(yīng)用層的我們一定要考慮的一個問題就是能效的提升會是多少,這種提升的正面例子就是你的應(yīng)用的穩(wěn)定性,負面例子自然是所帶來的額外開銷,響應(yīng)時間,維護成本等。
很欣慰的是Sentinel本身的設(shè)計還是很OK的,性能上的影響微乎其微,具體請參加官方wiki。
Sentinel的很多設(shè)計很多算法都是源于Guava,感興趣的同學(xué)可以試著去了解一下。
令牌桶,漏桶算法,是限流界的經(jīng)典理論支柱,無論是Hystrix還是Sentinel都是在其基礎(chǔ)上做的變化,所謂一法通,萬法通,便是其理。
一般來講,當你的應(yīng)用沒有復(fù)雜到一定程度的時候,我并不建議你入坑,假如你只是想吃米飯,但是來了一大堆食物,于你而言就是食之無味,棄之可惜。(此處對于其他中間件一樣適用)如果限流是必要的,但是應(yīng)用并沒有龐大到一定地步,那么我建議你單獨使用限流,利用已有的比如RateLimit來實現(xiàn)你的限流,(比如京東的部分應(yīng)用是采用該方式來進行的)。一般來講,底層應(yīng)用只需要限流就OK了,如果說你的應(yīng)用限流這快業(yè)務(wù)需求需要更靈活的,比如預(yù)熱,或者基于調(diào)用關(guān)系等更復(fù)雜更多樣的,那么沒錯,sentinel就是你的最佳選擇。
單機限流VS集群限流
如果你的應(yīng)用屬于分布式應(yīng)用,那么我并不推薦你使用單機限流,單機限流可以作為備選方案,而我們優(yōu)先考慮的一定是集群限流,雖然集群限流的引入會導(dǎo)致你的應(yīng)用復(fù)雜度又上升了一個級別。
我們需要明白一點,你的單機流量是你負載均衡的一個選擇結(jié)果,而你的負載均衡并不一定能夠保證流量按照你設(shè)定的理想狀態(tài)(這是負載均衡的作用,所以我們沒辦法破壞,負載均衡不同的策略導(dǎo)致不同的流量分配結(jié)果,受多方面影響,我司這邊采用的是最小活躍數(shù)。最小活躍數(shù)的選擇與系統(tǒng)的整個負載有關(guān),某一個接口占用過多資源,亦會導(dǎo)致其他接口出現(xiàn)連鎖反應(yīng),所以流量波動較大),所以很有可能出現(xiàn)某臺機器流量超標,某臺機器流量相對較少,比如10000個請求,負載均衡的選擇結(jié)果,A接受了6000個,B接受了4000個,而AB的單機限流均為5000,那么理想狀態(tài)下這10000個請求會被全部接受,但實際情況是只接受了9000,那么采用集群限流則不會出現(xiàn)這樣的情況。
降級熔斷篇
降級熔斷也是Sentinel的一個很優(yōu)秀的功能,用處不做贅述。
熔斷這塊Sentinel提供了三種方式,平均響應(yīng)時間,平均失敗率,異常數(shù)目。統(tǒng)計方式這塊是用滑動窗口來設(shè)計的。達到熔斷條件,Sleep。目前最新的版本支持自定義統(tǒng)計窗口。 此處的話時間窗口會有個默認值,5,即單位窗口內(nèi),達到熔斷條件的時候并不會立即熔斷,而是處于熔斷就緒的狀態(tài),具體熔斷與否取決于這五個請求,詳細自行觀看源碼。
再次說個題外話,我們需要明白一點,一旦采用平均值或者什么率這塊我們就需要明白一點,容易發(fā)生平均值效應(yīng)。假設(shè)我們采用了平均響應(yīng)時間,你前一百次的平均值都為100,但是后面系統(tǒng)出現(xiàn)問題,相應(yīng)時間這塊為100000,但是sentinel這塊的話記作5000(注:基于RT的話當系統(tǒng)相應(yīng)時間超過5000時會直接認為超時記錄為5000),平均值下來亦然達不到熔斷條件。也就是說當你的系統(tǒng)已經(jīng)處于不正常的狀態(tài)的時候并不能第一時間進行降級。
基于異常比例亦然,只是說當你的流量數(shù)過多的時候才會呈現(xiàn)出較好的表現(xiàn)。假設(shè)你前6個流量都是異常(可能是預(yù)熱或其他并非不正常的行為導(dǎo)致的異常),那么系統(tǒng)會直接進入降級。過早地夭折。
平均值受最大值影響,比率受初始分子分母的影響。 基于此 ,希望各位選用自己合適的方式來講行熔斷選擇。
尾篇 熔斷設(shè)計思考題外話
Hystrix這塊當進行熔斷時,會清空統(tǒng)計數(shù)據(jù),也就是說,熔斷關(guān)閉后,系統(tǒng)會認為是一個全新的統(tǒng)計開始,之前的數(shù)據(jù)都會被剔除,Sentinel這塊的設(shè)計由于要考慮整個系統(tǒng)的數(shù)據(jù)的準確性(數(shù)據(jù)源會被多方使用),并未做數(shù)據(jù)剔除,也就是說,如果熔斷時間過短,當熔斷關(guān)閉后仍位于同一個時間窗口的時候,此時會再次進入熔斷開啟狀態(tài)(因為統(tǒng)計數(shù)據(jù)的采集仍是沿用熔斷前的統(tǒng)計數(shù)據(jù))。解決的話目前我所建議的方式是熔斷這塊的數(shù)據(jù)統(tǒng)計單獨記錄,(不能影響其他數(shù)據(jù)的準確性)這個也是Sentinel的官方維護者樂有的建議。
熔斷這塊沒有一個熔斷半開的狀態(tài),有時候我們的系統(tǒng)確實被搞垮了,熔斷時間過后,仍然沒有恢復(fù)正常,這個時候我們最好的做法是放一個流量過去,而不是大多數(shù)流量,這個流量的成功與否決定著我們的系統(tǒng)是否恢復(fù)到熔斷關(guān)閉的狀態(tài)。
限流熔斷可以考慮是否引入其他因素來進行衡量,比如系統(tǒng)的負載等等。另外一點,當達到熔斷的時候我們是應(yīng)該直接熔斷還是說進行一個流量的限制,是進行平緩的降級還是說粗暴的降級。
主動降級:
熔斷與降級結(jié)果是一樣的,但是目的不一樣,一個屬于主動,一個屬于被動。被熔斷后采用備用方案屬于業(yè)務(wù)方的補償機制。這個不能稱之為降級,降級應(yīng)該是說當我有預(yù)感會有較大的流量的還好,我的負載比較高,那么我會梳理依賴關(guān)系,關(guān)閉一些次要服務(wù),讓出資源來給核心服務(wù)用。而且Sentinel這里的話也完全可以把降級給做出來,用戶可以主動的在控制臺做降級操作,自定義時間窗口大小。比如說大促期間,會關(guān)閉一些非核心的業(yè)務(wù),這塊盡可能把資源讓給核心業(yè)務(wù)。
目前Sentinel尚有許多需要修改更正的,大家可以踴躍參與。
尾篇:限流熔斷思考
限流
負載均衡保證了保證集群勞作下的均衡分工,不會出現(xiàn)累得累死,閑的閑死的情況,集群容錯則保證了當我們部分機器比如A犯錯回家反思的情況下其他機器可以迅速完成指派給A的任務(wù),而不至于讓業(yè)務(wù)方成為下一個望夫石,至于限流,則是我們廣大勞動人民一直追求的朝九晚六不加班,他保證了我們的機器不會超負荷工作導(dǎo)致宕機。 許多剛?cè)肼殘龅耐瑢W(xué)不明白為什么要限流,限流后部分用戶不是提供不了服務(wù)了嘛?這個問題很簡單,人心不足蛇吞象,如是也。
熔斷
底層服務(wù)出現(xiàn)問題時:錯誤數(shù)過多/平均響應(yīng)時間變長,上層應(yīng)用怎么做?底層應(yīng)用又該怎么做。 底層應(yīng)用限流是必須的。熔斷的具體情況需要具體分析, 代碼錯誤導(dǎo)致系統(tǒng)資源應(yīng)用不合理,比如特殊情況大對象的使用,數(shù)據(jù)庫出現(xiàn)慢查詢、索引未命中。這些情況出現(xiàn)導(dǎo)致系統(tǒng)的正常負載出現(xiàn)問題。限流可能已經(jīng)解決不了問題了。
另外熔斷的話這里最好業(yè)務(wù)方這里做一下相關(guān)處理。核心業(yè)務(wù),業(yè)務(wù)方應(yīng)當做好熔斷/降級之后的一個備用方案。
禁用服務(wù)
禁用 --> 導(dǎo)致的問題不一樣,還是業(yè)務(wù)owner最清楚,根據(jù)不同的問題,處理手段也不一樣。 非核心業(yè)務(wù)如果影響面可控也是可以采用直接下線服務(wù)的方式,這樣做的好處是不會再讓業(yè)務(wù)方苦苦等待,浪費有限的資源去等一個沒有結(jié)果的響應(yīng)。
擴容
擴容 --> 要速度,需要自身運維系統(tǒng)支持,能暫時解決問題。 擴容的主要依據(jù),系統(tǒng)資源利用率飆升,內(nèi)存使用爆表,頻繁GC。導(dǎo)致原因可能是流量過高,或者代碼不當這個時候應(yīng)用服務(wù)器擴容可以暫時解決問題。注:頻繁fullGc也可以進行優(yōu)化,如果代碼正確的情況下,這個時候就需要做jvm參數(shù)優(yōu)化了 慢sql-> 數(shù)據(jù)庫服務(wù)器。應(yīng)用sql語句優(yōu)化、復(fù)雜表查詢改寬表。加緩存等等。
放任
放任不管(等修復(fù)) --> 影響范圍能接受(禁用可能會有額外的風(fēng)險情況)
總結(jié)
以上是生活随笔為你收集整理的sentinel 时间窗口_Sentinel潜龙勿用篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何选择基金品种 看看你适合哪一种
- 下一篇: 打包指令_DD19A电动热熔打包机,更换