記得Martin大叔在《公司專屬應用程式架構模式》中特彆強調:“能夠不分布式的應 用就不要分布式”,這句話沒什麼問題,尤其對於做過分布式應用的人而言,就 更會有深刻的體會了,但這個世界偏偏就沒有那麼簡單,大多數人都會碰到分布 式應用的情境,尤其是對於大型應用而言,從集中式步入分布式是不可避免的, 只是也許是小型分布式的,也許是大型分布式的;也許是有高效能要求的,也許 是沒有的,在這篇blog中我們來看看java應用從集中式步入分布式後到底會帶來 些什麼挑戰。
blog按照應用從集中式演變為大型且高效能的應用的過程來敘述,這也是因 為這幾類應用對於設計、開發人員的要求也是從低到高的。
Level 1:小型分布式應用
對於做習慣了集中式應用的同學而言,當碰到小型分布式應用情境時,最明 顯的問題就是如何和遠端系統通訊,如何發訊息給遠端系統,告訴它做什麼 事情,並且得到事情處理的結果,對於java開發人員而言,更習慣的考慮方式也 許是如何去調用遠程系統提供的介面,在集中式的應用中可以採用A a=new AImpl();這樣的方式調用,但遠程就沒辦法這麼調用了。
在小型分布式應用中,最需要解決的就是上面所說的遠程系統通訊以及遠程 系統調用的問題了,為此就得學習相關的知識體系。
對於遠程系統通訊而言,至少應該知道下TCP/IP、UDP/IP是個大概什麼樣的 概念,BIO/NIO是什麼概念,另外就是需要知道下基於java如何去實現 tcp/ip+BIO(NIO)、udp/ip+BIO(NIO)的通訊,相應的會需要瞭解下Java序列化、 伺服器端採用線程池方式處理等知識,在掌握了這些知識後,基本上做一個小型 的java遠程通訊的應用不會有什麼太大的問題。
對於通過遠程系統調用就可實現的小型分布式應用而言,也許更為簡單,可 以只掌握怎麼用spring-remoting、axis或hessian這類的架構就可以了,直接就 可實現,當然,如果能瞭解下rmi、webservice是什麼機制就更好了,另外,畢 竟遠程調用很難做到完全和本地調用一樣,儘管所有的遠程調用架構都想做到完 全透明,但遠程調用時僅僅異常就比本地調用會多出好幾種來,例如網路異常、 逾時異常等,因此在調用遠程系統時,需要明確的瞭解這些異常的區分,當然, 或者可以認為都是同樣的遠程業務異常,但在追查錯誤時,則需要明確區分。
從上面這些知識點可以看出,應用即使是從集中式應用步入小型分布式應用 ,無論是對於開發、部署還是測試而言,都複雜了很多。
Level 2:高效能分布式應用
對於高效能分布式應用而言,要求就高很多了,因為要做到高效能,僅瞭解 怎麼用是不夠的,通訊和調用方面的技術都需要瞭解到底層的具體機制和實現。
對於遠程通訊方式的分布式應用而言,需要瞭解BIO/NIO具體有什麼不同,具 體機制是怎麼樣的,以及使用或參考目前主流的通訊架構,像mina、grizzly等 ,看看它們在做NIO實現時有什麼高超的技巧,除了瞭解這些外,還需要掌握線 程池應如何配置;長連、短連什麼概念,如何?;串連怎麼管理;序列化如何 最佳化等等。
對於遠程調用的分布式應用而言,則在上面的基礎上,還需要瞭解rmi、 webservice等的實現機制是怎麼樣的,另外就是spring-remoting、hessian、 axis的實現機制是怎麼樣的,有什麼可改進的地方,在明確了可改進的地方後需 要自己選擇相應的方案去實現。
從上面這些知識點可以看出,要寫出高效能的分布式應用真的不是蓋的,確 實挺困難的。