斷路器設計模式

斷路器是一個現代軟體開發的設計模式。用以偵測錯誤，並避免不斷地觸發相同的錯誤（如維護時服務不可用、暫時性的系統問題或是未知的系統錯誤）。

 常用時機 
假設有個應用程式每秒會與資料庫溝通數百次，此時資料庫突然發生了錯誤，程式設計師並不會希望在錯誤時還不斷地訪問資料庫。因此會在等待TCP連線逾時之前直接處理這個錯誤，並進入正常的結束程序（而非直接結束程式）。簡單來說，斷路器會偵測錯誤並且「預防」應用程式不斷地呼叫一個近乎毫無回應的服務（除非該服務已經安全到可重試連線了）。

 概念 
斷路器有分簡單與較進階的版本，簡單的斷路器只需要知道服務是否可用。而較進階的版本比起前者更有效率。進階的斷路器帶有至少三個狀態：
 關閉：斷路器在預設的情形下是呈現關閉的狀態，而斷路器本身「帶有」計數功能，每當錯誤發生一次，計數器也就會進行「累加」的動作，到了一定的錯誤發生次數斷路器就會被「開啟」，這個時候亦會在內部啟用一個計時器，一旦時間到了就會切換成半開啟的狀態。
 開啟：在開啟的狀態下任何請求都會「直接」被拒絕並且拋出異常訊息。
 半開啟：在此狀態下斷路器會允許部分的請求，如果這些請求都能成功通過，那麼就意味著錯誤已經不存在，則會被「切換回」關閉狀態並「重置」計數。倘若請求中有「任一」的錯誤發生，則會回復到「開啟」狀態，並且重新計時，給予系統一段休息時間。

 效能考量 
當安全是個益處，效能也就成為了實作斷路器的一個負面考量。因為需要不斷地檢查一個服務是否安全，且服務不僅會有一個，甚至會以多個方向擴展。

 實作範例 
 PHP 
下面是一個以 PHP 來實作的範例。這個範例是將一個 MySQL 伺服器的可用狀態處存進共享記憶體快取（APC）中並在之後以此判斷是否可用。

 檢查 
下列腳本能以工作排程來不斷地在某時刻執行檢查。

$db = mysql_connect('localhost','user','pass');
if ($db === false) {
    apc_store('dbUp', '已斷線');
} else {
    apc_store('dbUp', '可連線');
    @mysql_close($db);
}

 在應用程式中使用 
if (apc_fetch('dbUp') === '已斷線') {
    echo "資料庫目前不可用。請在數分鐘後嘗試。";
    exit;
}
$db  = mysql_connect('localhost', 'user', 'pass');
$res = mysql_db_query('database', 'SELECT * FROM table');

 外部連結 
 Example of PHP implementation with diagrams
 Example of C# implementation from Anders Lybeckers using Polly 
 Polly NuGet package 
 Example of C# implementation from Alexandr Nikitin 
 Implementation in Python 
 Stability patterns applied in a RESTful architecture 

Category:软件设计模式