如何提高阿里云上应用的可用性(二)
在單體應(yīng)用時代,最大的問題是如何解決數(shù)據(jù)庫瓶頸,而微服務(wù)之下,一個大應(yīng)用被拆分成了幾十個甚至上百個微服務(wù),數(shù)據(jù)訪問的壓力被傳導(dǎo)到了服務(wù)之間的網(wǎng)絡(luò),服務(wù)強弱依賴,服務(wù)雪崩等各種問題隨之而來,那么如何保障服務(wù)的可用性以及整個應(yīng)用的健壯性呢?常見的做法包括:
超時
程序員和女朋友約會在樓下等她的時候一般都會約定 “等你30分鐘啊”, 這就是一種超時約定,如果等了半小時女朋友還沒有下來,該怎么辦?一般有服務(wù)治理意識的程序員都會選擇超時退出及時止損(不知道這是不是程序員沒有女朋友的原因之一)
在應(yīng)用設(shè)計中,為避免集群雪崩或資源耗盡,一切調(diào)用都應(yīng)該設(shè)置超時時間,包括RPC/DB/緩存,服務(wù)端超時是必選配置。在實際的電商實際場景中,一般服務(wù)級別的超時時間通常會設(shè)置在100ms~300ms之間。
超時的設(shè)定需要注意一個問題就是超時的傳遞問題, 假設(shè)服務(wù)A調(diào)用服務(wù)B,A的超時設(shè)定為100ms,B為300ms,那么這個設(shè)定就是有問題,因為一旦B的調(diào)用時間超過了100ms,A無論如何都會超時,而B的繼續(xù)調(diào)用就會成為一種資源浪費,而在特別復(fù)雜的服務(wù)依賴關(guān)系中,超時的設(shè)定一定要考慮傳遞的問題
重試
當(dāng)程序員給喜歡的女孩子表白被拒絕了怎么辦,一般可以做出萬分痛苦狀接一句“要不要再考慮一下”,這就是一種重試,在服務(wù)調(diào)用中,重試就是當(dāng)對服務(wù)端的調(diào)用出現(xiàn)異常或者錯誤時,自動的再次發(fā)起調(diào)用請求,可見這種方式在服務(wù)端出現(xiàn)偶發(fā)性抖動或者網(wǎng)絡(luò)出現(xiàn)抖動的時候可以比較好的提高服務(wù)調(diào)用的成功率,但同時,如果服務(wù)端處在出現(xiàn)故障的邊緣時,也有可能成為壓垮駱駝的最后一根稻草,所以在生產(chǎn)環(huán)境中一定要慎用
熔斷
家里面使用的保險絲就是一種典型的熔斷,一旦電流過大的時候,就是斷開以保護整個電路,在程序設(shè)計中,一旦服務(wù)端的調(diào)用的異常或者錯誤比例超過一定的閾值時,就停止對此服務(wù)的調(diào)用,此時處于close狀態(tài),經(jīng)過一段時間的熔斷期后會嘗試重新發(fā)起調(diào)用,此時處于close-open狀態(tài),如果調(diào)用成功則放開調(diào)用,切換到open狀態(tài),否則繼續(xù)回到close狀態(tài)
隔離
遠洋大船的內(nèi)部都會設(shè)計多個水密倉,這樣一旦事故出現(xiàn)船體破損,也可以把影響控制在水密倉級別而不至于整個船沉默,這就是一種隔離策略,在程序設(shè)計中,為了達到資源隔離和故障隔離,通常有兩種做法,一種是通過線程池來進行隔離,對于不同類型資源新建不同的線程池,然后通過設(shè)置線程池的大小和超時時間來起到隔離資源使用的效果,但是這種方式由于需要新建線程池,對于資源開銷比較大,另外一種方式就是通過觀察線程的信號量也就是同類型資源的線程數(shù),當(dāng)超過相應(yīng)的閾值時快速拒絕新的資源請求。
限流和流控
本質(zhì)上這兩種方式都是對于超出服務(wù)提供能力的請求進行限制,區(qū)別是限流的話是立刻拒絕,而流控是讓請求進行排隊,這種方式對于流量的削峰填谷有著比較好的效果
以上的這些能力一般都會在微服務(wù)框架中集成提供,如阿里的Dubbo以及Spring Cloud的Hystrix,通過引入jar包在代碼中需要增強的地方加入添加相應(yīng)的高可用代碼,需要在應(yīng)用系統(tǒng)設(shè)計之初就充分考慮進去, 后期業(yè)務(wù)新增或變更時也需及時維護
接下來隨之而來的一個問題就是如何測試驗證這些高可用措施是有效的?閾值的設(shè)置是否合理?
常用的做法有兩個:
壓測
通過在云端模擬大量的用戶請求來測試應(yīng)用系統(tǒng)面對突發(fā)流量的能力和進行容量規(guī)劃,這里介紹一款阿里云的PTS產(chǎn)品,可以在云端模擬百萬并發(fā),以此可以檢測各鏈路是否有限流降級的措施,是否設(shè)置合理-傳送門。
故障演練
故障演練是一種比較新的高可用測試的方式,通過軟件層面模擬各種可能出現(xiàn)的故障,觀察應(yīng)用系統(tǒng)對于故障的隔離和降級能力。 這一專門的領(lǐng)域稱之為Chaos engineering, 在阿里內(nèi)部,通過故障演練平臺,每天都在進行著各種類型的故障演練,這些故障包括操作系統(tǒng)層面的故障如進程意外退出,CPU內(nèi)存飚高, 也包括網(wǎng)絡(luò)層面的故障如網(wǎng)絡(luò)延遲丟包,DNS解析錯誤, 還包括了應(yīng)用服務(wù)層面的故障如服務(wù)接口延遲,異常返回等。通過這種方式可以比較有效的驗證應(yīng)用的高可用能力,找到潛在風(fēng)險問題。
當(dāng)然對于種種原因沒有集成高可用框架,也沒有自己搭建故障演練平臺的各位同學(xué),阿里云推出了應(yīng)用高可用服務(wù)這一業(yè)界首款快速提高應(yīng)用高可用能力的SaaS產(chǎn)品,來自于多年雙十一穩(wěn)定性保障的經(jīng)驗,具有無需修改代碼,全界面操作和性能穩(wěn)定的特點,下面舉例示意如何給云上的應(yīng)用添加限流和降級的能力(傳送門:如何接入應(yīng)用高可用服務(wù))
對關(guān)鍵接口進行限流
?
?
?
?
?
?
對非關(guān)鍵業(yè)務(wù)進行降級處理
?
?
?
?
?
?
?
?
?
?
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的如何提高阿里云上应用的可用性(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一文纵览EMAS 到底内含多少阿里核心技
- 下一篇: Auto-Keras与AutoML:入门