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