分布式系統架構:服務容錯

1.為什么需要容錯

分布式系統的本質是不可靠的,一個大的服務集群中,程序可能崩潰、節點可能宕機、網絡可能中斷,這些“意外情況”其實全部都在“意料之中”。故障的發生是必然的,所以需要設計一套健壯的容錯機制來應對這些問題。

容錯策略,指的是“面對故障,我們該做些什么”;而容錯設計模式,指的是“要實現某種容錯策略,我們該如何去做”。下面介紹7種常見的容錯策略。

2.七種容錯策略

7種常見的容錯策略:故障轉移、快速失敗、安全失敗、沉默失敗、故障恢復、并行調用和廣播調用

故障轉移Failover

概念:分布式服務中,服務會有多個副本。如果調用的服務器出現故障,系統不會直接返回失敗,而是切換到其他服務副本上,保證返回調用成功的結果。

故障轉移需要設置重試次數,并且需根據實際業務場景考慮是否設置故障轉移。示例:

現在有Service A → Service B → Service C?這么一條調用鏈。假設 A 的超時閾值為?100ms,而 B 調用 C 需要?60ms,然后不幸失敗了,這時候做故障轉移其實已經沒有太大意義了。因為即使B調用C故障轉移成功了,調用耗時至少增加60ms,A已經超時了,這種故障轉移對系統無利。

適用場景:讀多寫少的采集,如:電商商品查詢;對成功率要求高的采集

快速失敗Failfast

當業務場景不允許,或者服務是非冪等時,重復調用會產生臟數據,就不能用故障轉移了,需要用到快速失敗。

概念:服務在調用失敗后,立即返回錯誤,不做任何重試

示例:支付場景中,調用銀行扣款接口,返回結果是網絡異常。這時候無法區分是否已扣款了,為避免重復扣款,只能服務拋出異常報錯,不能重試

適用場景:高實時性場景、交易支付場景

缺點:調用方需有較高容錯能力

安全失敗Failsafe

服務也區分主路和旁路,旁路的特點是服務失敗了也不影響核心業務。比如spring項目中的日志、Debug信息等。旁路邏輯不影響最終結果。因此,對這類邏輯的容錯策略就是,即使旁路邏輯失敗了,也當做正確返回。

概念:當服務調用失敗時,忽略異常并返回一個默認的結果,確保系統繼續運行。

適用場景:非核心業務場景,日志處理、監控采集

優點:最大化保證系統穩定性

示例:java中的try-catch,Dubbo中的failsafe策略

沉默失敗Failsilent

概念:大量請求如果都等到超時才失敗,可能將系統的線程、內存、網絡資源耗盡,影響整個服務穩定性。對該場景的失敗策略是:當請求失敗后,默認服務提供者一定時間內無法提供服務了,不再向它分配流量,將錯誤隔離開來。

實際應用場景:分布式系統中,單點故障時,流量調度系統不再給該節點分配流量,每隔5分鐘自動檢查節點是否恢復。

故障恢復Failback

不是單獨存在的,通常默認使用快速失敗+故障恢復策略

概念:故障恢復是指在服務調用失敗后,將失敗的請求異步存儲下來,存到數據庫或消息隊列中,并定時重試或補償,直到調用成功。這種方式對業務具有一定的“追溯”能力。故障恢復也需有最大重試次數限制

適用場景:實時性要求不高,數據一致性要求高的場景。如:庫存更新、訂單狀態同步

優點:提高系統最終一致性

缺點:系統需配合消息隊列,實現復雜

小結:前面5種容錯策略都是針對調用失敗后如何進行彌補的,下面2種是調用之前如何提供成功率的

并行調用Forking

概念:同時調用多個服務節點,只要任意一個節點返回成功結果即認為調用成功。對于調用結果相同或相似的服務節點,這種方式可大幅提高調用成功率。

適用場景:多副本部署場景、調用耗時長且高可用要求的場景。如:數據庫分片存儲查詢

優點:提供成功率,減少等待時間(取決于最先返回成功的節點)

缺點:增加系統開銷

廣播調用Broadcast

概念:請求發送給所有服務實例,并收集所有返回結果,要求所有請求全部成功才算成功。這種方式適用于需要對多個節點進行同步操作的場景

適用場景:刷新分布式緩存、配置同步

優點:所有節點都能執行操作

缺點:并行執行開銷大

實現方式:Dubbo的broadcast策略支持廣播調用

7種容錯策略對比

文章轉載自:卷福同學

原文鏈接:https://www.cnblogs.com/dnboy/p/18615703

體驗地址:引邁 - JNPF快速開發平臺_低代碼開發平臺_零代碼開發平臺_流程設計器_表單引擎_工作流引擎_軟件架構

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

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

相關文章

【Latex手冊】自用

收錄Latex使用文檔/工具 個人使用時候的tips,僅供個人使用 核心網頁:LaTeX 工作室 【1】首頁 | LaTeX 知識庫 (有詳細的入門教程) 【2】LaTeX工作室 - LaTeX工作室(一些模板) 【3】LaTeX 工作室 &…

Pytorch應用實戰(1)- 基于YOLO的視頻人臉馬賽克處理

免費鏈接: Blogger(需翻Q), Github 文章目錄 本文介紹給圖片的人臉打碼給視頻的人臉打碼本文介紹 YoloV11(Github)提供了非常方便的API幫助用戶實現目標檢測(detect)、語義分割(segement)、肢體識別(Pose)等功能。 本文將基于YoloV11的目標檢測來實現一個視頻人臉馬…

[IT項目管理]九.項目質量管理

九.項目質量管理 9.1項目質量管理的重要性 對于很多IT項目的差勁,大多數人只可以忍受。項目質量管理是IT項目管理的重要組成部分,對于提高項目成功率、降低項目成本、提升客戶滿意度至關重要。盡管很多人對IT項目的質量問題感到無奈&#x…

【Threejs】從零開始(六)--GUI調試開發3D效果

請先完成前置步驟再進行下面操作:【Threejs】從零開始(一)--創建threejs應用-CSDN博客 一.GUI界面概述 GUI(Graphical User Interface)指的是圖形化用戶界面,廣泛用在各種程序的上位機,能夠通過…

ffmpeg-SDL顯示BMP

效果圖如下 本文主要將我們通過創建窗口、渲染上下文工具、紋理工具、矩形框工具;其需要主要的是:首先我們在顯示BMP時,需要先創建好窗口,再使用渲染工具對窗口進行格式刷,使用紋理工具和渲染工具配合進行BMP圖片顯示…

多音軌視頻使用FFmpeg刪除不要音軌方法

近期給孩子找宮崎駿動畫,但是有很多是多音軌視頻但是默認的都是日語,電視上看沒辦法所以只能下載后刪除音軌文件只保留中文。 方法分兩步,先安裝FFmpeg在轉文件即可。 第一步FFmpeg安裝 FFmpeg是一個開源項目,包含了處理視頻的…

基礎二分查找總結題-單峰序列2類做法

🌰單峰序列題目描述 晴問算法 題目描述: 單峰序列是指,在這個序列中存在一個位置,滿足這個位置的左側(含該位置)是嚴格遞增的、右側(含該位置)是嚴格遞減的,這個位置被…

【SH】Ubuntu Server 24搭建Web服務器訪問Python程序研發筆記

文章目錄 說個問題寫個方案一、安裝Ubuntu Server二、安裝Web服務器采用Nginx服務器 三、安裝Python及依賴創建項目虛擬環境 四、安裝Python Web框架采用Flask框架創建和運行Flask應用(以后的重點) 五、安裝WSGI服務器采用Gunicorn 六、配置Nginx七、驗證…

Vue3 重置ref或者reactive屬性值

需要重新定義一個對象綁定復制給原對象 。 實例代碼: const data () > ({groupId: ,groupCode: ,groupName: ,groupType: ,});const formData ref(data());//重置對象值 const reset()>{Object.assign(formData, data()…

C#速成(GID+圖形編程)

常用類 類說明Brush填充圖形形狀,畫刷GraphicsGDI繪圖畫面,無法繼承Pen定義繪制的對象直線等(顏色,粗細)Font定義文本格式(字體,字號) 常用結構 結構說明Color顏色Point在平面中定義點Rectan…

vue iframe進行父子頁面通信并切換URL

使用通義千問提問后得到一個很好的示例。 需求是2個項目需要使用同一個面包屑進行跳轉&#xff0c;其中一個是iframe所在的項目&#xff0c;另一個需要通過地址訪問。通過 window.parent.postMessage &#xff0c;幫助 <iframe> 內嵌入的子頁面和其父頁面之間進行跨域通…

誰說C比C++快?

看到這個問題&#xff0c;我我得說&#xff1a;這事兒沒有那么簡單。 1. 先把最大的誤區打破 "C永遠比C快" —— 某位1990年代的程序員 這種說法就像"自行車永遠比汽車省油"一樣荒謬。我們來看個例子&#xff1a; // C風格 char* str (char*)malloc(100…

【ADS射頻電路學習筆記】1. ADS基本操作

下面介紹ADS中主要仿真器的使用 1. 直流仿真 直流仿真器在控制面板的simulator-dc 直流仿真器 但是ADS自帶有很多仿真器&#xff0c;可以直接來調用 選用晶體管電流掃描的模板 就可以輸出模板 然后調入晶體管模型 然后要設置掃描的電壓&#xff0c;選擇dc仿真器對vds進行掃描…

CSS學習記錄12

CSS浮動 CSSfloat屬性規定元素如何浮動 CSSclear屬性規定哪些元素可以在清除的元素旁邊以及在哪一側浮動。 float屬性 float屬性用于定位和格式化內容&#xff0c;例如讓圖像向左浮動到容器的文本那里。 float屬性可以設置以下值之一&#xff1a; left - 元素浮動到其容器…

Chinese-Clip實現以文搜圖和以圖搜圖(transformers版)

本文不生產技術&#xff0c;只做技術的搬運工&#xff01; 前言 作者昨天使用cn_clip庫實現了一版&#xff0c;但是覺得大家復現配置環境可能有點復雜&#xff0c;因此有使用transformers庫實現了一版&#xff0c;提供大家選擇&#xff0c;第一篇參考鏈接如下&#xff1a; Ch…

【Unity3D】無限循環列表(擴展版)

基礎版&#xff1a;【Unity技術分享】UGUI之ScrollRect優化_ugui scrollrect 優化-CSDN博客 using UnityEngine; using UnityEngine.UI; using System.Collections.Generic;public delegate void OnBaseLoopListItemCallback(GameObject cell, int index); public class BaseLo…

MSSQL AlwaysOn 可用性組(Availability Group)中的所有副本均不健康排查步驟和解決方法

當遇到 MSSQL AlwaysOn 可用性組(Availability Group)中的所有副本均不健康的情況時(MSSQL AG 副本名稱: All replicas unhealthy),這通常意味著可用性組無法正常工作,數據同步和故障轉移功能可能受到影響。以下是一些可能的原因及相應的排查步驟和解決方法: 1. 檢查副本…

springboot檢測配置是否存在,如果存在則返回,不存在則提示新增

我這里是以七牛為例子 在yml中添加七牛的相關配置 qiniu: #七牛的相關配置accessKey: your_access_keysecretKey: your_secret_keybucket: your_bucket_namedomain: your_domain 對應在給配置文件來一個相應的實體類QiniuConfig Component ConfigurationProperties(prefix &…

[NOIP2016 普及組] 海港 -STL-隊列queue

[NOIP2016 普及組] 海港 題目背景 NOIP2016 普及組 T3 題目描述 小 K 是一個海港的海關工作人員&#xff0c;每天都有許多船只到達海港&#xff0c;船上通常有很多來自不同國家的乘客。 小 K 對這些到達海港的船只非常感興趣&#xff0c;他按照時間記錄下了到達海港的每一…

【Vulkan入門】16-IndexBuffer

TOC 先叨叨 上篇介紹了如何使用VertexBuffer傳入頂點信息。兩個多星期了我們一直在玩三個點&#xff0c;本篇介紹如何渲染更多的點。 在渲染前考慮一個問題&#xff0c;渲染一個三角形需要三個點&#xff0c;渲染兩個相接的三角形需要幾個點&#xff1f; 答案是6個點&#xf…