主頁 > 軟體設計 > 微服務架構 | 5. 服務容災

微服務架構 | 5. 服務容災

2022-01-28 09:15:12 軟體設計

@

目錄
  • 前言
  • 1. 服務容災基礎知識
    • 1.1 由一個服務資源耗盡引發的連鎖反應
    • 1.2 服務雪崩效應
    • 1.3 四種客戶端彈性模式
    • 1.4 服務容災的幾種解決方案
    • 1.5 服務降級的參考指標
    • 1.6 服務限流的作用
    • 1.7 常見的幾種限流演算法
      • 1.7.1 計數器演算法
      • 1.7.2 滑動視窗演算法
      • 1.7.3 令牌桶演算法
      • 1.7.4 漏桶限流演算法
    • 1.8 利用 Postman 模擬請求高并發場景
    • 1.9 目前幾種流行的服務降級組件對比
  • 2. Hystrix
  • 3. Sentinel
  • 4. Resilience4j
  • 最后


前言

參考資料
《Spring Microservices in Action》
《Spring Cloud Alibaba 微服務原理與實戰》
《B站 尚硅谷 SpringCloud 框架開發教程 周陽》

當服務器壓力劇增的情況下,根據實際業務情況及流量,對一些服務和頁面有策略的不處理或換種簡單的方式處理,從而釋放服務器資源以保證核心交易正常運作或高效運作;


1. 服務容災基礎知識

1.1 由一個服務資源耗盡引發的連鎖反應

服務資源耗盡引發的連鎖反應

  • A 服務呼叫 B 服務,B 服務呼叫 C 服務;
  • 當 C 服務出現呼叫緩慢問題是,影響 B 服務的回應;B 服務又會影響 A 服務,導致其他服務不可用;

1.2 服務雪崩效應

  • 在微服務架構中,我們將業務拆分成一個個的服務,服務與服務之間可以相互呼叫,但是由于網路原因或者自身的原因,服務并不能保證服務的 100% 可用,如果單個服務出現問題,呼叫這個服務就會出現網路延遲,此時若有大量的網路涌入,會形成任務堆積,最終導致服務癱瘓;
  • 在分布式系統中,由于網路原因或自身的原因,服務一般無法保證 100% 可用,如果一個服務出現了問題,呼叫這個服務就會出現執行緒阻塞的情況,此時若有大量的請求涌入,就會出現多條執行緒阻塞等待,進而導致服務癱瘓;

服務雪崩效應

1.3 四種客戶端彈性模式

  • 客戶端負載均衡模式(client load balance):讓客戶端從服務注冊中心查找服務的所有實體,然后快取服務實體的物理位置;
  • 斷路器模式(circuit breaker):遠程服務呼叫時間太長,斷路器將會介入并中斷呼叫 ;
  • 后備模式(fallback):遠程服務呼叫失敗時,服務消費者將執行替代代碼路徑, 并嘗試通過其他方式執行操作,而不是生成一個例外;
  • 艙壁模式(bulkhead):每個遠程資源、都是隔離的,并分配給執行緒池;

四種客戶端彈性模式

1.4 服務容災的幾種解決方案

  • 服務隔離:即艙壁模式,將系統按照一定的原則劃分為若干個服務模塊,各個模塊之間相對獨立,無強依賴,常見的隔離方式有:執行緒池隔離和信號量隔離;
  • 服務超時:在上游服務呼叫下游服務的時候,設定一個最大回應時間,如果超過這個時間,下游未作出反應,就斷開請求,釋放執行緒;
  • 服務降級:即后備模式,服務提供一個托底方案,一旦服務無法正常呼叫,就使用托底方案;
  • 服務熔斷:即斷路器,上游服務為了保護系統整體的可用性,可以暫時切斷對下游服務的呼叫,一種“犧牲區域,保全整體”的策略;
  • 服務限流:限制系統的輸入和輸出流量已達到保護系統的目的;

1.5 服務降級的參考指標

  • 服務降級需要有一個參考指標,一般來說有以下幾種常見方案;
    • 平均回應時間:比如15內持續進入5個請求,對應時刻的平均回應時間均超過閾值,那么接下來在一個固定的時間視窗內,對這個方法的訪問都會自動熔斷;
    • 例外比例:當某個方法每秒呼叫所獲得的例外總數的比例超過設定的閾值時,該資源會自動進入降級狀態,也就是在接下來的一個固定時間視窗中,對這個方法的呼叫都會自動回傳;
    • 例外數量:和例外比例類似,當某個方法在指定時間視窗內獲得的例外數量超過閩值時會觸發熔斷;

1.6 服務限流的作用

  • 限流的主要目的是通過限制并發訪問數或者限制一個時間視窗內允許處理的請求數量來保護系統,一旦達到限制數量則對當前請求進行處理采取對應的拒絕策略,比如跳轉到錯誤頁面拒絕請求、進入排隊系統、降級等;
  • 從本質上來說,限流的主要作用是損失一部分用戶的可用性,為大部分用戶提供穩定可靠的服務;
  • 實際開發中的限流應用:
    • 在 Nginx 層添加限流模塊限制平均訪問速度;
    • 通過設定資料庫連接池、執行緒池的大小來限制總的并發數;
    • 通過 Guava 提供的 Ratelimiter 限制介面的訪問速度;
    • TCP 通信協議中的流量整形;

1.7 常見的幾種限流演算法

1.7.1 計數器演算法

  • 一種比較簡單的限流實作演算法;
  • 原理:在指定周期內累加訪問次數,當訪問次數達到設定的閩值時,觸發限流策略,當進入下一個時間周期時進行訪問次數的清零;
  • 存在臨界問題:前一個周期的后半部分與后一個周期的前半部分的總訪問次數可能超過閾值;

計數器演算法

1.7.2 滑動視窗演算法

  • 是一種流量控制技術,在 TCP 網路通信協議中,就采用了滑動視窗演算法來解決網路擁塞的情況;
  • 原理:在固定視窗中分割出多個小時間視窗,分別在每個小時間視窗中記錄訪問次數,然后根據時間將視窗往前滑動并洗掉過期的小時間視窗,最終只需要統計滑動視窗范圍內的所有小時間視窗總的計數即可;
  • 該演算法解決了臨界問題,Sentinel 采用滑動視窗演算法來實作限流

滑動視窗演算法

1.7.3 令牌桶演算法

  • 網路流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一種演算法;
  • 原理:對于每一個請求,都需要從令牌桶中獲得一個令牌,如果沒有獲得令牌,則需要觸發限流策略;
  • 由于令牌桶有固定的大小,當請求速度小于令牌生成速度時,令牌桶會被填滿,所以令牌桶能夠處理突發流量,也就是在短時間內新增的流量系統能夠正常處理,這是令牌桶的特性;

令牌桶演算法

1.7.4 漏桶限流演算法

  • 主要作用是控制資料注入網路的速度,平滑網路上的突發流量;
  • 原理:在漏桶演算法內部同樣維護一個容器,這個容器會以恒定速度出水,不管上面的水流速度多快,漏桶水滴的流出速度始終保持不變;
  • 訊息中間件就使用了漏桶限流的思想;
  • 請求速度大于漏桶流出水滴的速度時,觸發限流策略;
  • 令牌桶演算法的區別:漏桶無法處理短時間內的突發流量,漏桶限流演算法是一種恒定速度的限流演算法;

漏桶限流演算法

1.8 利用 Postman 模擬請求高并發場景

  • Postman 里新建多執行緒集合組;

Postman 里新建多執行緒集合組

  • 右鍵添加請求

右鍵添加請求

  • 將訪問地址添加進新新執行緒組;

將訪問地址添加進新新執行緒組

  • 設定多執行緒組的運行狀態;
    設定多執行緒組的運行狀態
  • 使用 postman 密集訪問 testA,下面配置的含義是:
    • 20個執行緒每次間隔 0.3s 訪問一次;

使用 postman 密集訪問 testA

1.9 目前幾種流行的服務降級組件對比

比較項 Hystrix Sentinel Resilience4j
貢獻者 Netflix Alibaba Apache 基金會
隔離策略 執行緒池隔離/信號量隔離 信號量隔離(并發執行緒數限流) 信號量隔離
熔斷降級策略 基于例外比率 基于回應時間、例外比率、例外數 基于例外比率、回應時間
實時統計實作 滑動視窗(基于 RxJava) 滑動視窗(LeapArray) Ring Bit Buffer
動態規則配置 支持多種資料源 支持多種資料源 有限支持
擴展性 插件的形式 多個擴展點 介面的形式
基于注解的支持 支持 支持 支持
限流 有限的支持 基于 QPS,支持基于呼叫關系的限流 Rate Limiter
流量整形 不支持 支持預熱模式、勻速器模式、預熱排隊模式 簡單的 Rate Limiter模式
系統自適應保護 不支持 支持 不支持
控制臺 簡單的監控查看 提供開箱即用的控制臺,可配置規則、查看秒級監控、機器發現等 不提供控制臺,可對接其它監控系統

2. Hystrix

Hystrix 是一個延遲和容災庫,旨在隔離遠程系統、服務和第三方庫的訪問點,停止級聯故障,并在故障不可避免的復雜分布式系統中實作彈性;

  • 點擊訪問:微服務架構 | 5.1 使用 Netflix Hystrix 斷路器

3. Sentinel

Sentinel 是面向分布式服務架構的輕量級流量控制組件,主要以流量為切入點,從限流、流量整形、服務降級、系統負載保護等多個維度來幫助我們保障微服務的穩定性;

  • 點擊訪問:微服務架構 | 5.2 基于 Sentinel 的服務限流及熔斷
  • 點擊訪問:微服務架構 | 5.4 Sentinel 流控、統計和熔斷的原始碼分析

4. Resilience4j

Resilicence4j 一款非常輕量、簡單,并且檔案非常清晰、豐富的熔斷工具,這也是Hystrix官方推薦的替代產品,不僅如此,Resilicence4j 還原生支持Spring Boot 1.x/2.x,而且監控也支持和 prometheus 等多款主流產品進行整合

  • 點擊訪問:


最后

新人制作,如有錯誤,歡迎指出,感激不盡!
歡迎關注公眾號,會分享一些更日常的東西!
如需轉載,請標注出處!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/421877.html

標籤:其他

上一篇:微服務架構 | 5. 服務容災

下一篇:在bash中獲取范圍或一組專案的長度的最簡單方法是什么?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more