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