這個(gè)月的8號、9號,個(gè)人很榮幸參加了China.NET Conf 2019 ,
中國.NET開發(fā)者峰會,同時(shí)分享了技術(shù)專題《.NET技術(shù)架構(gòu)下的混沌工程實(shí)踐》,給廣大的.NET開發(fā)小伙伴介紹混沌工程和高可用性改造實(shí)踐。會后大家伙聚餐的時(shí)候,陳計(jì)節(jié)老師建議大家將各自的議題分享到社區(qū),分享給大家。因此,今天和大家分享我的技術(shù)專題《.NET技術(shù)架構(gòu)下的混沌工程實(shí)踐》。
先放幾張大會照片:
整個(gè)專題主要分為四個(gè)部分:
* .NET分布式、微服務(wù)架構(gòu)下的高可用性挑戰(zhàn)
* 混沌工程簡介
* .NET混沌工程的實(shí)踐和成果分享
* 展望和規(guī)劃
一、.NET分布式、微服務(wù)架構(gòu)下的高可用性挑戰(zhàn)
目前,我們特來電的技術(shù)架構(gòu)是分布式、微服務(wù)化的,線上超過1000臺Server,高可用保障壓力很大:
* 系統(tǒng)7*24小時(shí)運(yùn)行,不允許宕機(jī),一旦宕機(jī)出問題,直接影響全國人民出行;
* 系統(tǒng)SLA要求99.95% ,全年可宕機(jī)時(shí)間只有4.38小時(shí);
* 服務(wù)調(diào)用鏈路越來越長,依賴越來越復(fù)雜,某個(gè)環(huán)節(jié)出問題,都有肯能導(dǎo)致服務(wù)雪崩、大規(guī)模宕機(jī);
* 線上遭遇:網(wǎng)絡(luò)抖動(dòng)、內(nèi)存泄露、線程阻塞、CPU被打爆、 數(shù)據(jù)庫被打爆、中間件宕機(jī)等棘手問題;
* 每天上百次發(fā)布更新,系統(tǒng)高可用性保障壓力非常大;
一張全鏈路監(jiān)控圖可以反映我們系統(tǒng)的復(fù)雜:
?
例如主機(jī)CPU被打爆的問題,線上經(jīng)常會遇到:
經(jīng)歷了線上各種高可用性問題后,我們做了很多反思和總結(jié):
系統(tǒng)在實(shí)現(xiàn)了分布式、微服務(wù)化之后,我們到底有多少把握來保證系統(tǒng)的正常運(yùn)行???
如果出現(xiàn)問題,整個(gè)分布式系統(tǒng)會變得非常“混亂”,甚至?xí)l(fā)系統(tǒng)的大規(guī)模宕機(jī)。
因此,我們有必要在線上事故出現(xiàn)之前,提前識別出系統(tǒng)有哪些弱點(diǎn)和問題,統(tǒng)一管控系統(tǒng)的固有混沌。
這套管控系統(tǒng)固有混沌的方法和體系,就是我們今天要介紹的主角:混沌工程。
二、混沌工程簡介
1. 什么是混沌工程?
通過受控的實(shí)驗(yàn),掌握系統(tǒng)運(yùn)行行為的過程,稱為混沌工程。
? ? 混沌工程的典型實(shí)踐:Chaos Monkey
? ? ?一只搗亂的猴子,在你的系統(tǒng)里面上蹦下竄,不停搗亂,直到搞掛你的系統(tǒng)。
? ??
2. 為什么需要混沌工程?
? ?混沌工程可以提升整個(gè)系統(tǒng)的彈性。
? ?通過混沌實(shí)驗(yàn),可以發(fā)現(xiàn)系統(tǒng)脆弱的一面,主動(dòng)發(fā)現(xiàn)這些問題,并解決這些問題。
3. 混沌工程怎么做?
? ?混沌工程的一般實(shí)施步驟:
1 選擇系統(tǒng)正常運(yùn)行狀態(tài)下的可度量指標(biāo),作為基準(zhǔn)的“穩(wěn)定狀態(tài)” 2 混沌實(shí)驗(yàn)分為實(shí)驗(yàn)組和對照組,都能保持系統(tǒng)的“穩(wěn)定狀態(tài)” 3
對實(shí)驗(yàn)組注入混沌事件,如服務(wù)不可用、中間件宕機(jī)等混沌事件 4 比較實(shí)驗(yàn)組和對照組“穩(wěn)定狀態(tài)”的差異
? ?如果混沌實(shí)驗(yàn)前后系統(tǒng)的“穩(wěn)定狀態(tài)”一致,則可以認(rèn)為系統(tǒng)應(yīng)對這種混沌事件是彈性的、高可用的。
? ?相反的,如果打破了系統(tǒng)的穩(wěn)定狀態(tài),我們就找到了一個(gè)系統(tǒng)弱點(diǎn),然后盡可能地解決它,提升系統(tǒng)的高可用性。
4. 實(shí)施混沌工程的推薦原則
* 明確系統(tǒng)穩(wěn)定運(yùn)行的狀態(tài)(指標(biāo))
* 混沌事件必須是現(xiàn)實(shí)世界可能發(fā)生的(合理的)
* 在生產(chǎn)環(huán)境進(jìn)行混沌實(shí)驗(yàn) :生產(chǎn)環(huán)境可以真實(shí)地反映系統(tǒng)的穩(wěn)定性
* 持續(xù)集成:線上應(yīng)用每天都在更新,通過持續(xù)集成的方式可以不斷發(fā)現(xiàn)問題、解決問題。
* 最小化影響范圍:線上進(jìn)行混沌實(shí)驗(yàn),必須可控,必須確定混沌實(shí)驗(yàn)的最小化影響范圍。
? ?這里大家會問:在生產(chǎn)環(huán)境上搞混沌實(shí)驗(yàn),能行嗎?
5. 現(xiàn)實(shí)中的混沌工程
? 生產(chǎn)環(huán)境必須以穩(wěn)定為前提,因此推薦O2O模式的混沌實(shí)驗(yàn):即線下演練、線上驗(yàn)證
? 在系統(tǒng)未經(jīng)過大規(guī)模高可用性改造之前,建議首先進(jìn)行全面的線下演練:
? ?
? ?那么, .NET技術(shù)架構(gòu)下的混沌工程怎么做?
三、.NET混沌工程的實(shí)踐和成果分享
? 我們線上系統(tǒng)主要用到了以下.NET技術(shù)棧和開源技術(shù):
* ASP.NET MVC
* 基于ASP.NET Core的Web運(yùn)行框架-WRF
* 基于ASP.NET Web API的分布式服務(wù)網(wǎng)關(guān)-SG
* 基于.NET RPC通訊技術(shù)的分布式微服務(wù)平臺-HSF
* 基于RabbitMQ和Kafka的消息應(yīng)用中心-MAC
* iBatis.NET & Entity Framework
* RabbitMQ & RabbitMQ Client for .NET
* Kafka & Confluent.Kafka
* Redis
* Nginx
* …
? ? 在上述.NET 技術(shù)架構(gòu)下,我們梳理了大量的混沌工程事件:
? ??
? ??
? ??
? ? ?通過大量的混沌實(shí)驗(yàn),我們逐步建立了提升系統(tǒng)高可用性的方法論和體系:
? ? ?
? ? ?.NET技術(shù)架構(gòu)下的高可用性改進(jìn)-依賴治理、容錯(cuò)降級? ? ?
? ? ? 業(yè)務(wù)場景:
? ? ? 隨著業(yè)務(wù)復(fù)雜度的上升,服務(wù)調(diào)用鏈路越來越長,鏈路上存在大量不可控的因素:? ? ??
*
* 網(wǎng)絡(luò)抖動(dòng),導(dǎo)致服務(wù)異常
* Redis、MQ、DB等中間件不可用,導(dǎo)致服務(wù)超時(shí)、異常
* 依賴的服務(wù)不可用,直接影響服務(wù)調(diào)用方??
? ? ?? ? ?
? ? ?如何應(yīng)對:識別強(qiáng)弱依賴,對弱依賴進(jìn)行降級,對強(qiáng)依賴有限降級? ? ?
*
* “用戶有感知” 是強(qiáng)依賴
* “用戶無感知” 是弱依賴
* 故障發(fā)生時(shí),核心業(yè)務(wù)有損失的是強(qiáng)依賴,無損失的是弱依賴
? ? ??? ? ?
? ? ? .NET技術(shù)架構(gòu)下的高可用性改進(jìn)-解耦/隔離? ? ? ?
? ? ? 業(yè)務(wù)場景:
? ? ? 核心業(yè)務(wù)的調(diào)用鏈路很長,整個(gè)鏈路上包含主流程和輔流程
? ? ? 輔流程的重要性低,不能因?yàn)檩o流程的不可用,影響了主流程。
? ? ??
? ? ? ?如何應(yīng)對:
? ? ? ?
? ? ? ?.NET技術(shù)架構(gòu)下的高可用性改進(jìn)-超時(shí)治理? ? ? ??
? ? ? ?業(yè)務(wù)場景:
? ? ? ?對于服務(wù)超時(shí),長時(shí)間等待會影響用戶體驗(yàn),并發(fā)大時(shí)還可能造成線程池被打爆。
? ? ? ?同時(shí)可能產(chǎn)生服務(wù)級聯(lián)反應(yīng),導(dǎo)致大范圍服務(wù)雪崩。
? ? ? ?? ? ? ?
? ? ? ? 應(yīng)對方案:
? ? ? ? 超時(shí)時(shí)間設(shè)置:服務(wù)剛上線時(shí),可以根據(jù)壓測情況預(yù)估一個(gè)值;
? ? ? ? 服務(wù)上線后再根據(jù)實(shí)際監(jiān)控進(jìn)行修改,比如設(shè)置99%的請求響應(yīng)時(shí)間為超時(shí)時(shí)間。
? ? ? ? 超時(shí)后的處理策略:
? ? ? ? 如果不是核心服務(wù),可直接超時(shí)返回失敗。
? ? ? ? 如果是核心服務(wù),可以設(shè)置相應(yīng)的重試次數(shù).? ? ? ? ?
? ? ? ? 示例:
? ? ? ? 配置服務(wù)超時(shí)時(shí)間
? ? ? ? 設(shè)置Http請求超時(shí)時(shí)間
? ? ? ? 設(shè)置數(shù)據(jù)庫連接超時(shí)、SQL執(zhí)行超時(shí)
? ? ? ? 代碼控制超時(shí)時(shí)間(例如:Polly的Timeout策略)
? ? ? .NET技術(shù)架構(gòu)下的高可用性改進(jìn)-重試補(bǔ)償? ? ? ? ?
? ? ? ? 業(yè)務(wù)場景:
? ? ? ? 實(shí)際線上應(yīng)用中,假如遇到網(wǎng)絡(luò)抖動(dòng)、發(fā)布重啟、數(shù)據(jù)庫阻塞超時(shí)等情況,都有可能引起服務(wù)調(diào)用失敗。? ? ? ? ?
? ? ? ? 應(yīng)對方案:
? ? ? ? 通過失敗重試、異常后的補(bǔ)償,盡可能地保證業(yè)務(wù)可用。
? ? ? ? 重試情況下:業(yè)務(wù)要保證冪等性、保證最終一致性。? ? ? ??
? ? ? ? 示例:
? ? ? ? 服務(wù)失敗重試策略
? ? ? ? 消息發(fā)送、消費(fèi)失敗重試、補(bǔ)償
? ? ? ? 代碼層面失敗重試補(bǔ)償(例如:Polly的Retry策略)
? ? ? 高可用改進(jìn)還有很多技巧,這里不一一詳細(xì)給大家贅述了。
? ? ??通過對系統(tǒng)進(jìn)行全面的高可用性改進(jìn),提升了我們對線上系統(tǒng)的信心!
四、 展望和規(guī)劃
? ?
2019年,我們啟動(dòng)了混沌工程實(shí)踐,逐步建立了混沌工程的自有方法論和體系,通過近一年的混沌工程實(shí)踐,混沌工程文化逐漸被開發(fā)團(tuán)隊(duì)所認(rèn)可。目前,混沌工程已經(jīng)逐步過渡到線上生產(chǎn)環(huán)境進(jìn)行(這來自于足夠的信心和把握)。但這只是一個(gè)起步,未來:
* 正式的混沌工程團(tuán)隊(duì):通過多團(tuán)隊(duì)配合、保障資源的持續(xù)投入
* 覆蓋所有的關(guān)鍵核心應(yīng)用:讓混沌工程深入到每個(gè)產(chǎn)品
* 堅(jiān)持O2O混沌工程實(shí)踐:線下演練、線上驗(yàn)證,更可控
* 混沌事件注入工具:ChaosBlade for .NET,工具讓混沌工程更高效
* 持續(xù)的混沌實(shí)驗(yàn):持續(xù)進(jìn)行、持續(xù)改進(jìn)
? ? 目標(biāo):通過混沌工程揭示問題、解決問題、形成閉環(huán),不斷提升系統(tǒng)高可用性。
以上是本次China.NET Conf 2019的技術(shù)專題,分享給大家。
?
周國慶
2019/11/15
?
?
?
熱門工具 換一換