素材網(wǎng)站建設(shè)需要多少費(fèi)用seo項目
1.定義
???????? Fail-safe 和 Fail-fast,是多線程并發(fā)操作集合時的一種失敗處理機(jī)制。
1.1.Fail-Safe機(jī)制
1.1.1.定義
???????? Fail-Safe 機(jī)制的設(shè)計目標(biāo)是在發(fā)生故障時,系統(tǒng)仍然能夠繼續(xù)運(yùn)行,盡量避免導(dǎo)致整個系統(tǒng)崩潰。即使發(fā)生錯誤或異常,系統(tǒng)會進(jìn)入一種安全的狀態(tài),確保功能的部分可用性或避免更嚴(yán)重的后果。
???????? Fail-safe,表示失敗安全,也就是在這種機(jī)制下,出現(xiàn)集合元素的修改,不會拋出 ConcurrentModificationException。
???????? 原因是采用安全失敗機(jī)制的集合容器,在遍歷時不是直接在集合內(nèi)容上訪問的,而是先復(fù)制原有集合內(nèi)容, 在拷貝的集合上進(jìn)行遍歷。由于迭代時是對原集合的拷貝進(jìn)行遍歷,所以在遍歷過程中對原集合所做的修改并不能被迭代器檢測到,java定義了一個 CopyOnWriteArrayList,在對這個集合遍歷過程中,對集合元素做修改后,不會拋出異常,但同時也不會打印出增加的元素。
???????? java.util.concurrent 包下的容器都是安全失敗的,可以在多線程下并發(fā)使用,并發(fā)修改。
???????? 常見的使用 fail-safe 方式遍歷的容器有 ConcerrentHashMap 和 CopyOnWriteArrayList 等
??? private static void failSafe() { ??????? CopyOnWriteArrayList<Integer> list ??????????? = new CopyOnWriteArrayList<Integer>(new Integer[] {1,2,3,4}); ??????? Iterator<Integer> iterator = list.iterator(); ??????? while(iterator.hasNext()) { ??????????? Integer i = iterator.next(); ??????????? System.out.println(i); ??????????? if(i == 3) { ??????????????? list.add(108); // 在fail-salf模式下,這里不會被打印 ??????????? } ??????? } ??? } |
1.1.2.作用
???????? 容錯性強(qiáng):Fail-Safe 機(jī)制會捕獲錯誤并采取補(bǔ)救措施,系統(tǒng)不會立即中止或崩潰。例如,它可能通過回滾、降級、冗余處理等方式維持基本的功能。
???????? 保證安全:它傾向于在發(fā)生故障時確保安全性或系統(tǒng)的核心功能。即使某個組件出錯,系統(tǒng)會將其隔離或使用默認(rèn)值來繼續(xù)運(yùn)行,而不會產(chǎn)生災(zāi)難性的影響。
???????? 延續(xù)運(yùn)行:系統(tǒng)能繼續(xù)執(zhí)行,保持盡可能正常的操作,用戶可能會感知到降級的服務(wù)或性能,但不會完全喪失功能。
1.1.3.典型應(yīng)用場景
???????? 核電站控制系統(tǒng):如果某個傳感器失效,系統(tǒng)會進(jìn)入安全模式,防止發(fā)生危險。
???????? 飛行控制系統(tǒng):如果某個子系統(tǒng)出問題,系統(tǒng)會通過冗余設(shè)計或故障切換繼續(xù)飛行。
???????? 數(shù)據(jù)庫事務(wù)處理:在分布式系統(tǒng)中,Fail-Safe 機(jī)制可能用于保持?jǐn)?shù)據(jù)的一致性,即使某些服務(wù)不可用,系統(tǒng)仍可以部分運(yùn)行。
1.1.4.優(yōu)缺點
???????? 優(yōu)點:提高系統(tǒng)的可靠性,防止單點故障影響整個系統(tǒng)。
???????? 缺點:可能隱藏潛在的問題,長時間運(yùn)行會積累更多隱患,影響后續(xù)的維護(hù)和修復(fù)。
1.2.Fail-Fast機(jī)制
1.2.1.定義
???????? Fail-Fast 機(jī)制的設(shè)計目標(biāo)是在系統(tǒng)檢測到故障時,立即終止運(yùn)行并報告錯誤,避免故障傳播或進(jìn)一步引發(fā)不可控的后果。系統(tǒng)在發(fā)現(xiàn)問題時不做任何掩飾,而是迅速失敗,讓問題暴露在早期階段。
???????? 例如,在集合遍歷過程中,一旦發(fā)現(xiàn)容器中的數(shù)據(jù)被修改了,會立刻拋出 ConcurrentModificationException 異常,從而導(dǎo)致遍歷失敗。定義一個 Map 集合,使用 Iterator 迭代器進(jìn)行數(shù)據(jù)遍歷,在遍歷過程中,對集合數(shù)據(jù)做變更時,就會 發(fā)生 fail-fast。
???????? java.util 包下的集合類都是快速失敗機(jī)制的, 常見的使用 fail-fast 方式遍歷的容器有 HashMap 和 ArrayList 等。
??? private void failFast() { ??????? Map<String, String> names = new HashMap<String, String>(); ??????? names.put("001", "name001"); ??????? names.put("002", "name002"); ??????? names.put("003", "name003"); ??????? names.put("004", "name004"); ??????? names.put("005", "name005"); ??????? ??????? Iterator<String> iterator = names.keySet().iterator(); ??????? while(iterator.hasNext()) { ??????????? System.out.println(names.get(iterator.next())); ??????????? names.put("006", "name006"); ??????? } ??? } |
1.2.2.作用
???????? 快速檢測錯誤:Fail-Fast 機(jī)制允許系統(tǒng)在檢測到不正常情況時立即失敗,從而盡早暴露問題。這使得開發(fā)人員或運(yùn)維人員能夠迅速發(fā)現(xiàn)并修復(fù)問題,防止其在系統(tǒng)中蔓延。
???????? 避免錯誤擴(kuò)散:Fail-Fast 機(jī)制通過立即中止故障進(jìn)程,防止問題影響其他模塊或功能,從而保護(hù)系統(tǒng)整體的穩(wěn)定性。
???????? 提高開發(fā)質(zhì)量:Fail-Fast 的策略常用于開發(fā)和測試環(huán)境中,以確保系統(tǒng)在最早的階段檢測到潛在的缺陷和問題。
1.2.3.典型應(yīng)用場景
???????? Java 集合框架:如ArrayList
中的迭代器就是 Fail-Fast 的。如果在遍歷過程中發(fā)現(xiàn)集合結(jié)構(gòu)被修改,它會立即拋出ConcurrentModificationException
,而不是繼續(xù)運(yùn)行可能導(dǎo)致不一致的狀態(tài)。
???????? 敏捷開發(fā):在持續(xù)集成和持續(xù)交付的環(huán)境中,Fail-Fast 機(jī)制用于在代碼中發(fā)現(xiàn)問題時立即中斷構(gòu)建,防止有缺陷的代碼被部署。
???????? 微服務(wù)架構(gòu):當(dāng)一個服務(wù)依賴的其他服務(wù)發(fā)生錯誤時,Fail-Fast 機(jī)制可以讓服務(wù)立即返回錯誤,而不是等待超時,避免造成更多資源浪費(fèi)。
1.2.4.優(yōu)缺點
???????? 優(yōu)點:加快問題的暴露和反饋,防止問題積累,有助于提高系統(tǒng)的整體質(zhì)量。
???????? 缺點:可能在系統(tǒng)中引發(fā)較多的短暫性失敗,尤其是在分布式系統(tǒng)中,網(wǎng)絡(luò)抖動或短暫的依賴故障也會導(dǎo)致系統(tǒng)快速終止。
2.Fail-Safe和Fail-Fast的對比
???????? Fail-Safe 機(jī)制適用于需要高容錯性的系統(tǒng),目標(biāo)是在故障情況下仍能保持系統(tǒng)的部分功能運(yùn)行,保障系統(tǒng)安全性。
???????? Fail-Fast 機(jī)制用于盡早暴露和處理錯誤,防止問題蔓延,適合對問題快速反饋和修復(fù)的場景。