在數學(xué)中,單元素集合是只有一個(gè)元素的集合,如{A}。在程序設計中,單例模式指的是一種設計模式,它模仿了數學(xué)概念,限制了一個(gè)類(lèi)只能實(shí)例化一個(gè)對象。這種設計模式對協(xié)調資源非常有用,但程序員常為了省事而過(guò)度使用它,這個(gè)話(huà)題我們之后再討論。在系統架構中,單例模式,或者更恰當地說(shuō)是單例反模式,被稱(chēng)為單點(diǎn)故障(SPOF)也就是說(shuō),當系統中的某個(gè)組件只有一個(gè)實(shí)例時(shí),一旦該實(shí)例出故障,就會(huì )造成系統范圍的影響。

SPOF在系統中隨處可見(jiàn),從單個(gè)的Web服務(wù)器到單個(gè)的網(wǎng)絡(luò )設備,但系統中最常見(jiàn)的SPOF是數據庫。其原因在于數據庫是最難擴展到多個(gè)節點(diǎn)上的,因此它只有一個(gè)實(shí)例。在圖9-1中,即使登錄、搜索和結賬服務(wù)器都有冗余,數據庫仍是SPOF。更精的是,所有服務(wù)池都依賴(lài)于這一個(gè)數據庫。雖然任何SPOF都不好,但數據庫SPOF的問(wèn)題更大,如果數據庫速度下降或者期讀了,那么對數據庫進(jìn)行同步調用的所有服務(wù)池都將受到這一事件影響。
我們常說(shuō)給客戶(hù)的一句口頭禪是“一切都會(huì )出故障”。這句話(huà)適用于服務(wù)器、存儲系統、網(wǎng)絡(luò )設備和數據中心。只要你知道的,都會(huì )出故障。
雖然很多人認為數據中心是不會(huì )出故障的,但多年來(lái),我們自己經(jīng)歷了十幾次數據中心運行中斷。高可用的存儲區域網(wǎng)絡(luò )也是如此,雖然它們比舊的SCSI硬盤(pán)陣列可靠得多,但仍舊會(huì )出故障。
大多數解決SPOF的方法是申請另一臺硬件,如X軸擴展所示的通過(guò)克隆服務(wù),讓每種服務(wù)都有兩個(gè)或更多個(gè)實(shí)例在運行。遺憾的是,事實(shí)并非總是如此簡(jiǎn)單。讓我們回頭再看看編寫(xiě)單例模式的步驟。雖然不是所有的單例類(lèi)都不允許在多臺服務(wù)器上運行一個(gè)服務(wù),但有些實(shí)現絕對會(huì )讓你免于遭受可怕的后果。較簡(jiǎn)單的情況是,如果代碼中有一個(gè)類(lèi),用于從用戶(hù)賬戶(hù)中減去基金,用單例模式實(shí)現它就會(huì )讓用戶(hù)的余額免于不測,如成為負數。如果把這段代碼放在兩臺獨立的服務(wù)器上,沒(méi)有額外的控制措施或聯(lián)絡(luò )信號,則很可能會(huì )造成兩個(gè)事務(wù)同時(shí)在用戶(hù)賬戶(hù)中記人借額,從而導致錯誤或不想發(fā)生的狀況。對于這種情況,我們需要修復代碼,或者依賴(lài)外部控制來(lái)預防。但最令人滿(mǎn)滿(mǎn)意的解決方案是修復代碼,在多個(gè)主機上實(shí)現服務(wù),通常我們需要快速修復SPOF。作為本原則的最后一個(gè)要點(diǎn),我們接下來(lái)將討論幾個(gè)快速修復方法。
第一個(gè)方法最簡(jiǎn)單,是使用主動(dòng)/被動(dòng)配置。一個(gè)服務(wù)在一臺服務(wù)器上主動(dòng)運行,在另外一臺服務(wù)器上被動(dòng)運行(不接收流量)。這種熱/冷配置,常被用作刪除數據庫SPOF的第一步。接下來(lái)的方法是用系統中的另一個(gè)組件控制數據訪(fǎng)問(wèn)。如果SPOF是服務(wù),那么用數據庫鎖可以控制數據的訪(fǎng)問(wèn)。如果SPOF是數據庫,那么可以設置主一從配置,由應用控制數據訪(fǎng)問(wèn),寫(xiě)更新操作由主數據庫完成,讀選擇操作由從數據庫完成。最后一個(gè)用于修復SPOF的配置是負載均衡器。如果Web服務(wù)器或應用服務(wù)器的一個(gè)服務(wù)是SPOF,且在代碼中不能消除,那么可以利用負載均衡器把一個(gè)用戶(hù)的請求只發(fā)送給池中的一臺服務(wù)器。這是通過(guò)會(huì )話(huà) cookie實(shí)現的,即設置用戶(hù)的瀏覽器,且允許負載均衡器每次都把該用戶(hù)的請求重定向到同一個(gè)Web或應用服務(wù)器,從而形成一種一致?tīng)顟B(tài)。
我們介紹了幾種消除SPOF的方法,在不能及時(shí)修改代碼的情況下可以輕松地實(shí)現它們。但是最后的方法最好,即修復代碼,允許網(wǎng)站設計服務(wù)的多個(gè)實(shí)例在不同的物理服務(wù)器上運行,從而盡可能消除SPOF。記住,“一切都會(huì )出故障”,所以當SPOF出故障時(shí),請不要吃驚。
本文地址:http://www.havencoinwallet.com//article/3500.html