讀發佈!設計與部署穩定的分散式系統(第2版)筆記12_超時模式

来源:https://www.cnblogs.com/lying7/archive/2023/06/26/17503259.html
-Advertisement-
Play Games

![](https://img2023.cnblogs.com/blog/3076680/202306/3076680-20230625162750165-109306308.png) # 1. “模式採用量”絕不是好的質量指標 ## 1.1. 應該形成一種“面向恢復”的思維模式 ## 1.2. 良 ...


1. “模式採用量”絕不是好的質量指標

1.1. 應該形成一種“面向恢復”的思維模式

1.2. 良好的模式能為開發工程師提供架構和設計方面的指導,從而減少、消除或緩解系統中的裂紋產生的影響

1.2.1. 在新發佈軟體後,它們能讓你睡個安穩覺

2. 超時

2.1. 超時是一種簡單的機制,只要認為響應不會到來,就可以停止等待

2.2. 代碼不能永遠等待響應,它遲早需要放棄等待

2.3. 早些年

2.3.1. 網路問題隻影響那些從事操作系統、網路協議、遠程文件系統等低層級軟體開發的程式員

2.4. 今天

2.4.1. 每個系統都是分散式系統

2.4.2. 每個應用程式都必須應對網路的基本特點:網路會出故障

2.4.2.1. 電纜可能會斷開

2.4.2.2. 傳輸線路上的交換機或路由器可能會壞掉

2.4.2.3. 正在定址的電腦可能會崩潰

2.4.3. 即使已經建立了通信,參與其中的任何部件都可能隨時中斷

3. 超時機制/模式

3.1. 良好的超時機制可以提供失誤隔離功能

3.1.1. 其他服務或設備中出現的問題不一定會成為你的問題

3.2. 在遠離複雜硬體層的抽象層,良好的超時設置越來越罕見

3.2.1. 一些高級API只有很少的超時設置,有些幾乎沒有明確的設置

3.2.2. 許多API只提供了一個帶有超時時間的調用和一個更簡單、更容易但永久阻塞的調用

3.2.3. 商業軟體客戶端程式庫缺乏超時設置

3.2.3.1. 這些庫通常代表系統直接進行套接字調用

3.3. 超時可以用於單個服務

3.3.1. 任何資源池都可能枯竭

3.3.2. 在向資源池檢入一個資源之前,調用線程會被阻塞

3.3.3. 無論資源是否可用,所有引起線程阻塞的資源池都必須有一個超時時間,以確保調用線程最終會解除阻塞

3.4. 處理所有潛在的超時會給代碼帶來不必要的複雜性

3.4.1. 網路連接代碼完全充斥著針對各類超時的錯誤處理邏輯

3.4.2. 有一半的代碼是進行錯誤處理,而不是提供特性

3.5. 以生產環境(而不是QA環境)為目標,其本質就是處理“是生存還是毀滅”這樣的終極問題

3.5.1. 用於錯誤處理的代碼會增強系統的韌性

3.5.2. 系統的用戶可能不會因此而感激你,系統不發生停機就沒人會留意你,但你晚上能睡得更好

3.6. 超時模式和快速失敗模式都解決了延遲問題

3.6.1. 快速失敗模式適用於傳入系統的請求

3.6.2. 超時模式則主要適用於系統發出的出站請求

3.7. 超時模式還可以通過阻止客戶端處理整個結果集,緩解“無限長結果集”的問題

3.8. 超時模式適用於一般類型的問題,它能幫助系統從意料之外的事件中恢復過來

4. 方案

4.1. 使用通用網關為連接處理、錯誤處理、查詢執行和結果處理提供模板

4.1.1. 將這種通用的交互模式收集到一個類中,採用斷路器模式時就會變得更加容易

4.1.2. 斷路器可以記錄一段時間內的超時情況,如果超時過於頻繁,斷路器就會跳閘

4.2. 那些使用回調函數或響應式編程風格的編程語言運行時,也能更輕鬆地設定超時時間

4.3. 將超時模式應用於集成點、阻塞線程和緩慢響應

4.4. 當操作時間過長,有時無須明確其原因時,只需要放棄操作並繼續做其他事

4.5. 超時通常與重試一同出現

4.5.1. 在“儘力而為”的設計理念下,軟體會試圖重覆執行一次超時操作

4.5.2. 在系統失效後立即重試,會產生一系列結果,其中只有一些是有益的

4.5.3. 如果由於重大問題而導致操作失敗,那麼立即重試的結果可能是再次失敗

4.5.4. 在數據中心的內部,系統失效可能是因為連接的另一端出現問題

4.5.4.1. 快速重試很有可能再次失敗

4.6. 慢慢地重試排隊等待的任務,能使系統更加穩健

4.6.1. 延遲重試

4.6.2. 大多數情況下,應該把操作任務放入隊列,稍後再重試

4.7. 務必給客戶一個答案

4.7.1. 由於某種超時而無法完成操作,最好返回一個結果

4.7.1.1. 失敗了

4.7.1.2. 成功了

4.7.1.3. 其他提示信息


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # Spark Spark是一種快速、通用、可擴展的大數據分析引擎,2009年誕生於加州大學伯克利分校AMPLab,2010年開源,2013年6月成為Apache孵化項目,2014年2月成為Apache的頂級項目,2014年5月發佈spark1.0,2016年7月發佈spark2.0,2020年6月 ...
  • ![file](https://img2023.cnblogs.com/other/3195851/202306/3195851-20230625185718639-2144905227.jpg) > 近日,Apache SeaTunnel 正式發佈 2.3.2 版本。此時距離上一版本 2.3.1 ...
  • 摘要:本文將介紹如何在 Docker 環境下搭建 MS SQL Server 的主從同步,幫助讀者瞭解主從同步的原理和實現方式,進而提高數據的可靠性和穩定性。 一、前言 在當今信息化的時代,數據的安全性和穩定性顯得尤為重要。資料庫是許多企業和組織存儲和管理數據的核心,因此如何保證資料庫的高可用性和數 ...
  • ## case1(表鎖的讀-寫-讀阻塞) 上篇文檔中提到過 >WRITE locks normally have higher priority than READ locks to ensure that updates are processed as soon as possible. Thi ...
  • 很多小微型應用程式也需要一些數據處理和計算能力,如果集成一個資料庫就顯得太沉重了,這種情況下 SQLite 是一個不錯的選擇,它架構簡單,集成方便,可持久化存儲數據,並提供 SQL 實現計算能力。 但是,對於某些較複雜的場景,SQLite 仍有不足之處。 ...
  • 開心一刻 今天答應準時回家和老婆一起吃晚飯,但臨時有事加了會班,回家晚了點 回到家,本以為老婆會很生氣,但老婆卻立即從廚房端出了熱著的飯菜 老婆:還沒吃飯吧,去洗下,來吃飯吧 我洗好,坐下吃飯,內心感動十分;老婆坐旁邊深情的看著我 老婆:你知道誰最愛你嗎 我毫不猶豫道:你 老婆:誰最關心你? 我:你 ...
  • # 引言 在當今互聯網時代,數據的規模和複雜性不斷增長,傳統關係型資料庫面臨著無法滿足高併發和大規模數據存儲需求的挑戰。為瞭解決這一問題,開源社區涌現出了一系列分散式資料庫解決方案,其中TiDB作為一種新興的分散式資料庫引起了廣泛的關註。本文將介紹TiDB的基本概念、特點以及適用的應用場景。 TiD ...
  • ### 背景 在項目中有集成低代碼平臺的想法,經過多方對比最後選擇了 amis,主要是需要通過 amis 進行頁面配置,導出 json 供移動端和 PC 端進行渲染,所以接下來講一下近兩周研究 amis 的新的以及一些簡單經驗,供大家參考. ### 什麼是 amis amis 是一個低代碼前端框架, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...