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