常見容錯機制:failover、failfast、failback、failsafe

1.failover:失效轉移
Fail-Over的含義爲「失效轉移」,是一種備份操做模式,當主要組件異常時,其功能轉移到備份組件。其要點在於有主有備,且主故障時備可啓用,並設置爲主。如Mysql的雙Master模式,當正在使用的Master出現故障時,能夠拿備Master作主使用java

2.failfast:快速失敗
從字面含義看就是「快速失敗」,儘量的發現系統中的錯誤,使系統可以按照事先設定好的錯誤的流程執行,對應的方式是「fault-tolerant(錯誤容忍)」。以JAVA集合(Collection)的快速失敗爲例,當多個線程對同一個集合的內容進行操做時,就可能會產生fail-fast事件。例如:當某一個線程A經過iterator去遍歷某集合的過程當中,若該集合的內容被其餘線程所改變了;那麼線程A訪問集合時,就會拋出ConcurrentModificationException異常(發現錯誤執行設定好的錯誤的流程),產生fail-fast事件。sql

3.failback:失效自動恢復
Fail-over以後的自動恢復,在簇網絡系統(有兩臺或多臺服務器互聯的網絡)中,因爲要某臺服務器進行維修,須要網絡資源和服務暫時重定向到備用系統。在此以後將網絡資源和服務器恢復爲由原始主機提供的過程,稱爲自動恢復數組

4.failsafe:失效安全
Fail-Safe的含義爲「失效安全」,即便在故障的狀況下也不會形成傷害或者儘可能減小傷害。維基百科上一個形象的例子是紅綠燈的「衝突監測模塊」當監測到錯誤或者衝突的信號時會將十字路口的紅綠燈變爲閃爍錯誤模式,而不是所有顯示爲綠燈。安全


————————————————
版權聲明:本文爲CSDN博主「青魚入雲」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/u011305680/article/details/79730646服務器

 

failfast(快速故障):網絡

若是出現故障,則當即報錯。
一般用於非冪等性操做,如:下單操做,若是寫入故障,則當即報錯,沒必要重試。spa

 

failsafe(故障安全):.net

若是出現故障,則能夠忽略,由於這種故障不會形成損失或損失在可接受範圍內。
一般用於輔助性操做,如:寫入監控日誌,若是寫入故障,則忽略。線程

 

failover(故障切換):設計

若是出現故障,則重試備份操做模式。

一般用於冪等性操做,如:MySql的雙Master模式,若是主Master故障,則切換至從Master。
重試一般會帶來更多延時。

 

failback(故障恢復):

故障切換以後,若是主要操做模式恢復,則自動從備份操做模式恢復主要操做模式。

如:MySql的雙Master模式,若是主Master故障,則failover至從Master;當主Master恢復以後,則自動切換至主Master。

————————————————
版權聲明:本文爲CSDN博主「hanchao5272」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/hanchao5272/article/details/96439552

 

 

快速故障和故障安全系統簡介:

若是系統在發生錯誤時當即關閉,則稱爲快速失敗系統這些系統不會繼續出現錯誤。當系統發生故障時,它們會當即中止運行。故障快速系統中的錯誤會當即暴露出來。可是,故障安全系統並不是如此。即便系統發生故障,它們也不會中止運行。他們經過隱藏錯誤來繼續操做。他們不會當即暴露錯誤。他們繼續錯誤。哪一個系統是最好的系統,始終是系統設計領域中討論最多的話題。在本文中,咱們將討論限制爲java中的Fail Fast和Fail Safe Iterators

Java中的快速失敗和安全失敗迭代器:

Java中的迭代器使咱們可以遍歷Collection對象。集合返回的迭代器本質上是  快速失敗的或本質上是故障安全的。若是在迭代集合時對其進行了修改,則快速失敗迭代器會當即引起  ConcurrentModificationException故障安全迭代器中,若是在迭代迭代集合時對其進行了修改,則不會引起任何異常。由於,它們對集合的克隆進行操做,而不對實際的集合進行操做。讓咱們詳細瞭解故障快速迭代器故障安全迭代器。

Java中的快速失敗迭代器:

大多數collection類型返回的Fail-Fast迭代器在對collection進行迭代時,不允許對collection進行任何結構性修改。(結構修改意味着添加,刪除或更新集合中的元素)若是在迭代過程當中對集合進行結構化修改,則會拋出  ConcurrentModificationException可是,若是集合是由迭代器本身的方法(如remove())修改的,則它們不會引起任何異常

快速迭代器如何工做?

全部Collection類型都維護一個內部對象數組(Object [])以存儲元素。失敗快速迭代器直接今後數組中獲取元素。他們老是認爲在迭代其內部元素時不會修改此內部數組。爲了知道集合是否被修改,他們使用了一個稱爲modCount的內部標誌,該標誌在每次修改集合時都會更新。每當Iterator調用next()方法時,它都會檢查modCount若是在建立此迭代器以後發現modCount 已更新,則拋出  ConcurrentModificationException

ArrayListVectorHashMap返回的迭代器本質上都是  Fail-Fast

1個
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18歲
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.ArrayList;
import java.util.Iterator;
 
public class FailFastIteratorExample
{      
     public static void main(String[] args)
     {
         //Creating an ArrayList of integers
         
         ArrayList<Integer> list = new ArrayList<Integer>();
         
         //Adding elements to list
         
         list.add( 1452 );
         
         list.add( 6854 );
         
         list.add( 8741 );
         
         list.add( 6542 );
         
         list.add( 3845 );
         
         //Getting an Iterator from list
         
         Iterator<Integer> it = list.iterator();
         
         while (it.hasNext())
         {
             Integer integer = (Integer) it.next();
             
             list.add( 8457 );      //This will throw ConcurrentModificationException
         }
     }  
}
輸出:
1個
2
3
4
Exception in thread "main" java.util.ConcurrentModificationException
     at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
     at java.util.ArrayList$Itr.next(Unknown Source)
     at pack1.MainClass.main(MainClass.java: 32 )

Java中的故障安全迭代器:

若是在迭代集合時對其進行了修改,則故障保護迭代器不會引起任何異常。由於,它們迭代集合的克隆而不是實際集合。所以,這些迭代器不會注意到對實際集合進行的任何結構修改。可是,這些迭代器有一些缺點。其中之一是,並不老是保證您在迭代時會得到最新數據。由於建立迭代器後對集合的任何修改都不會在迭代器中更新。這些迭代器的另外一個缺點是,就時間和內存而言,建立集合副本的開銷會更大。

ConcurrentHashMap返回的迭代器是故障安全的迭代器。

1個
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18歲
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
 
public class FailSafeIteratorExample
{      
     public static void main(String[] args)
     {
         //Creating a ConcurrentHashMap
         
         ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();
         
         //Adding elements to map
         
         map.put( "ONE" , 1 );
         
         map.put( "TWO" , 2 );
 
         map.put( "THREE" , 3 );
         
         map.put( "FOUR" , 4 );
         
         //Getting an Iterator from map
         
         Iterator<String> it = map.keySet().iterator();
         
         while (it.hasNext())
         {
             String key = (String) it.next();
             
             System.out.println(key+ " : " +map.get(key));
             
             map.put( "FIVE" , 5 );     //This will not be reflected in the Iterator
         }
     }  
}

輸出:

二:
二四:四
一:
三:3

快速失敗與Java中的失敗安全迭代器:

失敗快速迭代器 故障安全迭代器
失敗快速迭代器不容許在對集合進行迭代時對其進行修改。 故障保護迭代器容許在對集合進行迭代時對其進行修改。
若是在迭代集合時對其進行了修改,則這些迭代器將引起ConcurrentModificationException 若是在迭代集合時對其進行了修改,則這些迭代器不會引起任何異常。
他們使用原始集合遍歷集合的元素。 他們使用原始集合的副本遍歷集合的元素。
這些迭代器不須要額外的內存。 這些迭代器須要額外的內存來克隆集合。
例如:ArrayListVectorHashMap返回的迭代器 例如:ConcurrentHashMap返回的迭代器
相關文章
相關標籤/搜索