12、架構-流量治理之服務容錯

概述? ? ??

??????????容錯性設計(Design for Failure)是微服務的另一個核心原 則,也是筆者書中反復強調的開發觀念轉變。不過,即使已經有一定 的心理準備,大多數首次將微服務架構引入實際生產系統的開發者, 在服務發現、網關路由等支持下,踏出了服務化的第一步以后,很可 能仍會經歷一段陣痛期,隨著拆分出的服務越來越多,隨之而來會面 臨以下兩個問題的困擾。

  • 由于某一個服務的崩潰,導致所有用到這個服務的其他服務都 無法正常工作,一個點的錯誤經過層層傳遞,最終波及調用鏈上與此 有關的所有服務,這便是雪崩效應。如何防止雪崩效應便是微服務架 構容錯性設計原則的具體實踐,否則服務化程度越高,整個系統反而 越不穩定。
  • 服務雖然沒有崩潰,但由于處理能力有限,面臨超過預期的突 發請求時,大部分請求直至超時都無法完成處理。這種現象產生的后 果與交通堵塞類似,如果一開始沒有得到及時的治理,后面就需要很 長時間才能使全部服務都恢復正常。

????????本章我們將圍繞以上兩個問題,提出服務容錯、流量控制等一系列解決方案。這些措施并不是孤立的,它們相互之間存在很多聯系,其中許多功能必須與此前介紹過的服務注冊中心、服務網關、負載均衡器配合才能實現。理清楚這些技術措施背后的邏輯鏈條,是了解它 們工作原理的捷徑。

服務容錯

????????在現代分布式系統的構建中,服務容錯設計是一個不可或缺的主題。Martin Fowler與James Lewis提出的“微服務的九個核心特征”是構建微服務系統的指導性原則,但不是技術規范,沒有嚴格的約束力。在實際構建系統時,其中多數特征可能會有或多或少的妥協,比如分散治理、數據去中心化、輕量級通信機制、演進式設計,等等。但也有一些特征是不能妥協的,其中的典型就是今天我們討論的主題:容錯性設計。

????????容錯性設計不能妥協的原因在于分布式系統的不可靠性。一個大的服務集群中,程序可能崩潰、節點可能宕機、網絡可能中斷,這些“意外情況”其實全部都在“意料之中”。原本信息系統設計成分布式架構的主要動力之一就是為了提升系統的可用性,最低限度也必須保證將原有系統重構為分布式架構之后,可用性不下降才行。如果服務集群中出現任何一點差錯都能讓系統面臨“千里之堤潰于蟻穴”的風險,那分布式恐怕就沒有機會成為一種可用的系統架構形式了。

容錯性設計的必要性

在一個復雜的分布式系統中,服務之間通過網絡進行通信,而網絡的不可靠性和服務本身的復雜性使得故障不可避免。常見的故障類型包括硬件故障、軟件故障、網絡故障和人為錯誤。這些故障如果沒有有效的容錯機制,將對系統的可用性和穩定性造成嚴重影響。

容錯性設計的核心理念是“設計中包含對失敗的預期和應對措施”,這有助于避免系統因單點故障而發生崩潰,從而提升整體系統的穩定性和可靠性。接下來,我們將詳細探討幾種常見的容錯策略和設計模式。

容錯策略

  1. 故障轉移(Failover): 故障轉移是指當某個服務節點發生故障時,系統會自動切換到其他服務副本,以保證服務的連續性。實現這種策略需要使用負載均衡器或服務注冊發現工具(如Consul、Eureka)。例如,當服務A所在的節點出現故障時,負載均衡器會將流量重定向到服務A的另一副本。這種機制保證了即使某個節點故障,用戶的請求仍能被正常處理。然而,故障轉移策略需要限制重試次數,以避免因頻繁切換導致的系統不穩定。

  2. 快速失敗(Failfast): 在某些情況下,服務不允許進行故障轉移,因為故障轉移可能會導致重復數據或其他問題。快速失敗策略在檢測到故障后立即返回錯誤,而不是進行重試,以避免進一步的問題。舉例來說,在一個實時支付系統中,如果服務B發生故障,與其反復重試導致延遲增加,不如快速返回錯誤,讓上游服務進行處理。

  3. 安全失敗(Failsafe): 對于一些非關鍵服務或旁路邏輯,即使發生故障,也不會影響核心業務的正常運行。安全失敗策略允許這些非關鍵服務在發生故障時返回默認值或零值,以保證系統的穩定性。例如,在一個推薦系統中,如果推薦服務出現問題,可以返回一個空列表,而不影響用戶的購物流程。

  4. 沉默失敗(Failsilent): 當某個服務出現大量超時時,系統會默認該服務在一定時間內無法提供服務,從而將其隔離,避免對系統其他部分造成影響。例如,如果服務C的響應時間顯著增加,系統可以將其標記為不可用,暫時不再發出請求。

  5. 故障恢復(Failback): 在故障發生后,系統會自動嘗試重試調用,并在后臺異步處理這些請求,直到成功。故障恢復通常與快速失敗結合使用。例如,在訂單處理系統中,如果某個訂單處理服務失敗,系統可以將失敗的訂單放入隊列中,并在后臺進行重試,直到處理成功。

  6. 并行調用(Forking): 系統同時向多個服務副本發起調用,只要其中一個返回成功,就認為調用成功。這種策略增加了成功的概率和響應速度,適用于關鍵業務場景。例如,在支付系統中,可以同時向多個支付網關發起請求,哪個先返回成功就采用哪個的結果。

  7. 廣播調用(Broadcast): 系統同時向多個服務副本發起調用,所有調用必須成功才認為此次調用成功。這種策略通常用于需要確保數據一致性的場景,如刷新分布式緩存。例如,在數據同步系統中,向所有節點廣播更新指令,確保每個節點的數據都得到更新。

容錯設計模式

  1. 斷路器模式(Circuit Breaker): 斷路器模式通過監控服務調用的成功和失敗次數,當故障次數達到閾值時,將斷路器狀態切換為“OPEN”,直接返回失敗,不再發出遠程請求,從而避免因持續失敗導致系統資源消耗和請求堆積。這種模式有三個狀態:

    • 關閉(Closed):服務正常運行,所有請求正常通過。
    • 打開(Open):檢測到連續多次失敗,斷路器打開,直接拒絕請求。
    • 半開(Half-Open):經過一段時間,斷路器嘗試部分請求,若成功則恢復正常狀態,否則繼續保持打開。

    例如,Netflix的Hystrix庫實現了斷路器模式,當某個服務的錯誤率超過設定閾值時,Hystrix會打開斷路器,短時間內不再向該服務發起請求,從而保護系統不被單個服務的故障拖垮。

  2. 艙壁隔離模式(Bulkhead Isolation): 艙壁隔離模式通過將系統資源隔離成多個獨立的部分,防止某一部分的故障影響整個系統。比如,可以為不同的服務分配獨立的線程池、連接池等資源,確保某個服務的資源消耗不會影響其他服務。就像船只的艙壁一樣,即使一個艙壁進水,也不會影響整艘船的浮力。

    例如,假設系統中有服務A和服務B,它們分別使用獨立的線程池。如果服務A由于突發流量導致線程池耗盡,服務B仍然可以正常工作,因為它不受服務A的影響。

  3. 重試模式(Retry): 重試模式在請求失敗后自動重試,增加請求成功的概率。可以在調用邏輯中實現重試機制,設置重試次數和間隔時間。例如,在一個文件上傳系統中,如果上傳失敗,可以設置重試三次,每次間隔五秒,以增加上傳成功的幾率。

  4. 服務降級(Fallback): 服務降級策略在服務發生故障時提供降級邏輯,確保系統在某種程度上仍能提供服務。例如,當推薦服務發生故障時,可以返回緩存的推薦結果或默認推薦列表,而不是返回錯誤。通過這種方式,系統在部分功能失效的情況下仍能提供基本服務。

容錯實現技術和工具

  1. Netflix Hystrix: Hystrix是Netflix開源的一個庫,用于實現熔斷、隔離、限流等容錯機制。Hystrix能夠幫助開發者迅速搭建容錯體系。其主要功能包括:

    • 熔斷器:實現斷路器模式,防止故障擴散。
    • 隔離策略:通過獨立的線程池隔離不同的服務,防止資源爭用。
    • 請求緩存:在短時間內緩存請求結果,減少重復調用。
    • 監控與報警:提供豐富的監控指標和報警機制,幫助及時發現和處理故障。
  2. Sentinel: Sentinel是阿里巴巴開源的一個高可用防護組件,提供了豐富的流量控制、熔斷降級、系統負載保護等功能。其主要功能包括:

    • 流量控制:通過設置流量閾值,防止系統過載。
    • 熔斷降級:實現斷路器和服務降級功能,保證系統穩定性。
    • 熱點參數限流:對熱點參數進行限流保護,避免單點壓力過大。
    • 系統負載保護:根據系統負載自動調整限流策略,保證系統在高負載下的穩定性。
  3. Resilience4j: Resilience4j是一個輕量級、函數式的容錯庫,靈感來自于Hystrix,但設計上更為現代化,支持Java 8及以上版本。其主要功能包括:

    • 熔斷器:實現斷路器模式,防止故障擴散。
    • 重試:實現重試機制,增加請求成功的概率。
    • 限流:對請求進行限流保護,防止系統過載。
    • 緩存:在短時間內緩存請求結果,減少重復調用。

實際應用中的考慮

  1. 監控和報警: 實時監控系統的運行狀態,及時發現和處理故障。可以使用Prometheus、Grafana等工具進行監控和報警設置。通過設置關鍵服務的性能指標,如響應時間、錯誤率等,可以實時監控系統的健康狀況,并根據這些指標設置報警閾值,當指標超過閾值時觸發報警,確保故障能夠及時被發現和處理。

  2. 容量規劃: 通過壓力測試和容量評估,合理規劃系統資源,確保系統在高并發和高負載下仍能穩定運行。例如,可以通過模擬高并發場景進行壓力測試,測試系統的最大承載能力。根據壓力測試結果,確定系統需要的資源配置,并設置自動擴展策略,根據系統負載自動調整資源配置。這樣可以確保系統在高并發請求下仍能保持穩定和高效。

  3. 分布式事務管理: 在分布式系統中,事務管理是一個復雜的問題。可以使用TCC(Try-Confirm-Cancel)、Saga等模式來管理分布式事務,確保數據的一致性和可靠性。例如,TCC模式將事務拆分為嘗試、確認、取消三個階段,確保事務的一致性。Saga模式則將事務拆分為一系列獨立的小事務,通過補償操作來保證最終一致性。這些模式在需要跨多個服務的事務場景中非常有效,如訂單處理、支付流程等。

結論

服務容錯是保證分布式系統高可用性和可靠性的重要手段。通過合理使用故障轉移、快速失敗、安全失敗、沉默失敗、故障恢復、并行調用、廣播調用等策略,以及斷路器、艙壁隔離、重試、服務降級等設計模式,并結合實際場景進行優化和調整,可以有效提升系統的穩定性和容錯能力。

在分布式系統中,服務容錯不僅是技術上的挑戰,更是設計理念上的轉變。通過前面詳述的各種策略和模式,我們可以看到,容錯設計不僅僅是為了應對故障,更是為了構建一個具有高彈性和高可用性的系統。這種系統能夠在面對各種不確定因素時,仍能保持穩定和可靠,最終為用戶提供持續的優質服務。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24587.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24587.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24587.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

web前端 麥子學院:探索前端技術的無盡奧秘

web前端 麥子學院:探索前端技術的無盡奧秘 在數字化浪潮洶涌的時代,Web前端技術作為連接用戶與互聯網的橋梁,正以其獨特的魅力吸引著無數開發者。麥子學院,作為前端技術學習的殿堂,為我們提供了深入探索前端技術的寶貴…

Linux下線程的互斥與同步詳解

🤖個人主頁:晚風相伴-CSDN博客 💖如果覺得內容對你有幫助的話,還請給博主一鍵三連(點贊💜、收藏🧡、關注💚)吧 🙏如果內容有誤或者有寫的不好的地方的話&…

android:text 總為大寫字母的原因

當設置某個 Button 的 text 為英文時&#xff0c;界面上顯示的是該英文的大寫形式&#xff08;uppercase&#xff09;。例如&#xff1a; <Buttonandroid:id"id/btn"android:layout_width"wrap_content"android:layout_height"wrap_content"…

centos7 安裝 mysql5.7 LTS

centos7 安裝 mysql5.7 LTS 參考&#xff1a; https://blog.csdn.net/EB_NUM/article/details/105425622 可以在運行安裝程序之前導入密鑰&#xff1a; sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022第一步、下載MySQL 安裝包&#xff1a; sudo wget h…

Python 中的內存管理機制

Python 的內存管理機制主要由兩個部分組成&#xff1a;垃圾回收機制和引用計數。 垃圾回收機制主要負責檢測和回收不再被使用的內存。Python 使用的是自動垃圾回收機制&#xff0c;也就是說程序員不需要手動釋放內存。Python 的垃圾回收機制采用了引用計數的方法來追蹤和回收不…

植物大戰僵尸雜交版破解C++實現

文章目錄 前言準備工作&#xff1a;基地址與偏移UI界面設計和綁定項目模板總覽圖生成與實現信號處理1、陽光值更新:BTN12、三種錢幣值更新:BTN2-BTN43、冷卻刷新:BTN54、鎖定陽光&#xff1a;check15、無冷卻&#xff1a;check26、OnTimer&#xff08;&#xff09;和OnClose&am…

git合并多個項目并保留提交版本記錄

目錄 一、場景 二、合并步驟 1.本地新建 all 目錄&#xff0c;并初始化 2.在 all 中添加 a&#xff0c;b&#xff0c;c 的遠程分支 3.驗證是否添加成功 4.在 all 目錄下&#xff0c;獲取 a, b,c 的 master 分支數據 5.合并項目并移動到子目錄中 6.推送 all 的 master 分支…

二開版微交易系統

下載地址&#xff1a;二開版微交易系統

集成學習概述

概述 集成學習(Ensemble learning)就是將多個機器學習模型組合起來&#xff0c;共同工作以達到優化算法的目的。具體來講&#xff0c;集成學習可以通過多個學習器相結合&#xff0c;來獲得比單一學習器更優越的泛化性能。集成學習的一般步驟為&#xff1a;1.生產一組“個體學習…

實戰 | YOLOv10 自定義數據集訓練實現車牌檢測 (數據集+訓練+預測 保姆級教程)

導讀 本文主要介紹如何使用YOLOv10在自定義數據集訓練實現車牌檢測 (數據集訓練預測 保姆級教程)。 YOLOv10簡介 YOLOv10是清華大學研究人員在Ultralytics Python包的基礎上&#xff0c;引入了一種新的實時目標檢測方法&#xff0c;解決了YOLO以前版本在后處理和模型架構方面…

規范系統運維:系統性能監控與優化的重要性與實踐

在當今這個高度信息化的時代&#xff0c;企業的IT系統運維工作顯得尤為關鍵。其中&#xff0c;系統性能監控和優化是運維工作中不可或缺的一環。本文旨在探討規范系統運維中系統性能監控與優化的重要性&#xff0c;并分享一些實踐經驗和策略。 一、系統性能監控與優化的重要性…

RAGFlow 學習筆記

RAGFlow 學習筆記 0. 引言1. RAGFlow 支持的文檔格式2. 嵌入模型選擇后不再允許改變3. 干預文件解析?4. RAGFlow 與其他 RAG 產品有何不同&#xff1f; ?5. RAGFlow 支持哪些語言&#xff1f; ?6. 哪些嵌入模型可以本地部署&#xff1f; ?7. 為什么RAGFlow解析文檔的時間比…

自動化裝箱封箱解決方案:深度探討其優勢及故障處理技巧

在當今這個快節奏、高效率的時代&#xff0c;自動化裝箱封箱解決方案以其獨特的優勢&#xff0c;正逐漸成為物流、倉儲等行業的新寵。它不僅能大幅提升作業效率&#xff0c;還能顯著降低人工成本&#xff0c;減少人為錯誤。星派將深度探討自動化裝箱封箱技術的顯著優勢&#xf…

【Vue】練習-mutations的減法功能

文章目錄 一、需求二、完整代碼 一、需求 步驟 二、完整代碼 Son1.vue <template><div class"box"><h2>Son1 子組件</h2>從vuex中獲取的值: <label>{{ $store.state.count }}</label><br><button click"handleA…

C# 界面控件中英切換

編程軟件:VS 2015 需求:界面有兩個按鈕&#xff0c;點擊可以將界面上所有控件進行不同語言的切換。 一共兩種方案&#xff0c;個人認為第二種方案使用范圍更廣&#xff08;這里以中英文切換為例&#xff09;。 方案一:如圖所示&#xff0c;建立兩個資源文件 將所需控件的中英…

海思SS928(SD3403)部署YOLOv5-YOLOv7步驟詳解

1. YOLO模型資料 本文檔內容以yolov5-7.0工程、yolov5s模型為例。 a. 模型結構 詳細的模型結構可以利用netron工具打開.pt或.onnx模型查看。 b. 模型參數即驗證結果 其中,YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x為五種類型的預訓練模型,其包含的檢測類別相…

利用Pandas進行數據清洗與過濾:Python實戰指南

利用Pandas進行數據清洗與過濾&#xff1a;Python實戰指南 作為一個Python愛好者和數據分析從業者&#xff0c;我一直在探索如何利用Python來更高效地處理和分析數據。Python語言以其簡單易學、功能強大的特點&#xff0c;成為了數據分析領域的寵兒。本文將分享一些實用的Pyth…

2024 cicsn ezbuf

文章目錄 參考protobuf逆向學習復原結構思路exp 參考 https://www.y4ng.cn/posts/pwn/protobuf/#ciscn-2024-ezbuf protobuf 當時壓根不知道用了protobuf這個玩意&#xff0c;提取工具也沒提取出來&#xff0c;還是做題做太少了&#xff0c;很多關鍵性的結構都沒看出來是pro…

android 異屏同顯---學習筆記

實現 Android 異屏同顯(多個屏幕顯示同樣的畫面)可以通過多種方法來完成,具體實現方式會根據你的需求和設備的支持情況有所不同。以下是幾種常見的方法: 方法 1:使用 Cast SDK 如果你想要將內容投屏到智能電視或其他支持 Cast 的設備上,可以使用 Google Cast SDK。 主…

Unity 集成 FMOD 音頻管理插件 2.02

Unity 集成 FMOD 音頻管理插件 2.02 3. 集成教程&#xff1a;3.1 設置Unity項目3.2 設置FMOD項目3.3 設置 FMOD for Unity3.4 添加聲音&#xff1a;卡丁車引擎3.5 添加聲音&#xff1a;氛圍3.6 添加聲音&#xff1a;音樂3.7 刪除現有音頻3.8 下一步 10. 腳本 API 參考10.1 基礎…