這個(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

          ?

          ?
          ?

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點(diǎn)信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                日日操操 | 成人爱爱视频 | 伊人五月丁香 | 精品在线免费观看 | 天堂色色|