主頁 > 軟體設計 > 讀發布!設計與部署穩定的分布式系統(第2版)筆記12_超時模式

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

2023-06-26 09:12:04 軟體設計

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. 其他提示資訊

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

標籤:架構設計

上一篇:讀發布!設計與部署穩定的分布式系統(第2版)筆記11_無限長的結果集

下一篇:返回列表

標籤雲
其他(161608) Python(38248) JavaScript(25513) Java(18259) C(15238) 區塊鏈(8272) C#(7972) AI(7469) 爪哇(7425) MySQL(7266) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4606) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2437) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) HtmlCss(1972) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(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
最新发布