分布式系統(tǒng)的十大誤區(qū)
“基本上每個人,在第一次構(gòu)建一個分布式應(yīng)用時,多會做出下面十個假設(shè)。但是在長期的運作過程中,他們都會被證明是錯誤的,而且會引發(fā)大麻煩和令人痛苦的學(xué)習(xí)經(jīng)歷”。
1. 網(wǎng)絡(luò)是可靠的。在面對網(wǎng)絡(luò)時,它很難稱得上是我們所謂的可靠——對于當(dāng)今的互聯(lián)網(wǎng)來說,丟失報文、服務(wù)器宕機(jī)、路由器被黑,等等這些依然是現(xiàn)實存在的。盡管你的網(wǎng)絡(luò)可能真的是永遠(yuǎn)不會崩潰,但是你的網(wǎng)絡(luò)并不是你唯一需要考慮的——所有那些你不能做出保證的網(wǎng)絡(luò)也要保持處于激活狀態(tài)。這就是為什么需要你的系統(tǒng)在面臨故障的時候是健壯的,同時還需要你去定義系統(tǒng)所需的性能和可擴(kuò)展性的類型,以使你可以確保你所擁有的基礎(chǔ)設(shè)施可以處理故障。
2. 響應(yīng)時間是零。網(wǎng)絡(luò)不是免費的——它會把時間花到通過網(wǎng)線(以及許多構(gòu)成互聯(lián)網(wǎng)的中間設(shè)備)傳輸工具上。在開發(fā)過程中,網(wǎng)絡(luò)的響應(yīng)時間經(jīng)常是非常接近于零,如果開發(fā)部門與其它部門的網(wǎng)絡(luò)是物理隔離的,那就更是如此,這在大型的公司中非常常見。事實上,在很多情況下,響應(yīng)時間會盡其可能的接近與零,這是因為開發(fā)者的習(xí)慣是為了方便起見,在同一臺機(jī)器上運行所有的層——應(yīng)用服務(wù)器、瀏覽器、數(shù)據(jù)庫和其它任何必須的東西。但是不要忘了,特別是在Web應(yīng)用的情況下,你的客戶可能不是在100-或1000-兆的網(wǎng)絡(luò)上,有些可能仍然是在撥號上網(wǎng),這取決于客戶端的選擇。正是應(yīng)為這個原因,所以要確保作為表示層部分或通信連接的主體部分而被傳輸?shù)臄?shù)據(jù)量要最小化。
3. 寬帶是無限的。與我們想要的正好相反,網(wǎng)絡(luò)在同一時刻可以發(fā)送的信息量具有有限的容量。特別是當(dāng)企業(yè)系統(tǒng)暴露給公眾,而某些我們潛在的用戶仍然運行在慢速的撥號連接上和飽和的DSL連接上時,我們將具有與LAN同等的帶寬的想法是可笑的。這就是為什么又是盡可能多的將人物從線上移除,而采用厚客戶端去訪問傳統(tǒng)的基于HTML的系統(tǒng)的原因。
4. 網(wǎng)絡(luò)是安全的。近年來,這一在被證明是一條謬論,即使是在公司內(nèi)部的Intranet內(nèi)也是如此。不僅黑客可以相當(dāng)容易的穿透我們的防火墻(例如,防火墻不能防范SQL注入攻擊),而且在許多情況下,你也不能相信在網(wǎng)絡(luò)內(nèi)部的人們——最近的研究表明,公司損失的70%左右都?xì)w咎于雇員的偷竊和詐騙行為。
5. 拓?fù)浣Y(jié)構(gòu)不會發(fā)生變化。對任何IT商店來說都會時常發(fā)生的一件事情就是變化。服務(wù)器增加了、服務(wù)器減少了、機(jī)器需要被替換了、硬件需要升級了等等。我們竭盡全力來跟上變化的形式,但是如果我們寫的軟件能夠自動調(diào)整以適應(yīng)變化,那將會很有益處。
6. 只有一個管理員。合并、收購和字串分派只是應(yīng)用場景的一部分——你還使得進(jìn)出公司的人達(dá)到了警戒水品,包括你的系統(tǒng)管理員。即使你今天有一個應(yīng)用場景,到了明天就會有一個完全不一樣的應(yīng)用場景。正是因為如此,你需要在構(gòu)建企業(yè)系統(tǒng)時牢記管理、部署和監(jiān)視。而且,隨著PC數(shù)量的增長,以及自己動手開發(fā)的程序的普及分發(fā),不用提及像章魚觸手一樣延伸的伙伴關(guān)系在商業(yè)中變得向當(dāng)?shù)爻R姡褪侨魏我粋€團(tuán)隊、部門、甚至公司擁有一個程序的假設(shè)都在發(fā)生變化。現(xiàn)在問題的關(guān)鍵是,你構(gòu)建的任何應(yīng)用都可能轉(zhuǎn)變?yōu)榱硪粋€完全不同的公司所依賴的某些事物,而你卻并不了解該公司。所以你不能假設(shè)你擁有自己的數(shù)據(jù)庫,或是有隨意改變構(gòu)件接口的特權(quán)。
7. 傳輸?shù)拇鷥r是零。對象通過網(wǎng)線傳輸并不容易。事實上,在Java中,除了原始類型之外,其他對象通過網(wǎng)線傳輸?shù)脑诰€表示都是同構(gòu)的。者意味著這要超出將實際的二進(jìn)制位通過網(wǎng)線推送出去所需要的開銷,你還需要合并一大堆的數(shù)據(jù)位,以打包和解包數(shù)據(jù)本身,正是因為這個原因,請關(guān)注你要產(chǎn)生的在網(wǎng)絡(luò)上來回的數(shù)量,使用的技術(shù)包括成批傳遞數(shù)據(jù)以使得每一次在網(wǎng)絡(luò)上的來回顯得更有價值。
8. 網(wǎng)絡(luò)是同構(gòu)的。當(dāng)你停下來去思考.NET迅猛地普及勢頭,與大量現(xiàn)有的用Python、Perl、C++以及其他語言編寫的系統(tǒng)并存的現(xiàn)象時,會很容易的認(rèn)識到系統(tǒng)級別上的同構(gòu)性比硬件級別的同構(gòu)性更不可能實現(xiàn)。因此,你需要仔細(xì)考慮在你的架構(gòu)中的提供商的中立性,并且無論如何都要實現(xiàn)在當(dāng)前去構(gòu)建它,你可能在以后會無法擁有他的某些部分。
9. 系統(tǒng)是整體式的。盡管可能在早期的系統(tǒng)中確實是這樣,但是關(guān)鍵是一個企業(yè)系統(tǒng)經(jīng)常以某種方式與其它系統(tǒng)集成在一起,即時它們是訪問相同的數(shù)據(jù)庫。特別是在今天,系統(tǒng)的不同部分是在不同的時間被修訂的(表示層變化了而業(yè)務(wù)邏輯卻保持未變,反之亦然)。這使得認(rèn)識到系統(tǒng)不同部分需要被部署,以及進(jìn)行版本控制,而且在很多情況下,他們被彼此獨立的開發(fā)的這一事實,比以往任何時候都重要。因此,你希望支持基于構(gòu)建的設(shè)計,并指望構(gòu)建彼此間松散耦合的構(gòu)件。
10. 系統(tǒng)是可以結(jié)束的。企業(yè)經(jīng)常轉(zhuǎn)換業(yè)務(wù),并且經(jīng)常改變環(huán)境。只有當(dāng)你認(rèn)為你已經(jīng)完成了某件事時。商務(wù)專家會跑過來提出一些新需求或是一些對你剛剛做完的事情的變更。這正是為什么會產(chǎn)生拓?fù)浣Y(jié)構(gòu)變更以及為什么系統(tǒng)不能保證長期的同構(gòu)的原因。
----摘錄自Ted Neward關(guān)于企業(yè)級應(yīng)用開發(fā)