了解一件事情是怎么做的一個正確的方式是看看它在現實中是怎么做的。軟件工業一直以來都在為"很多idea僅僅在理論上說說"所困惑。與此同時,軟件廠商不斷地把這些idea作為最佳實踐推銷給大家。
?????? ?很少的軟件開發者親眼目睹過大規模可擴展的架構這一領域。幸運的是,有時我們可以看到和聽到關于這方面公開發表的資料。我讀過一些好的資料關于google的硬件基礎設施的設計以及yahoo的頁面渲染專利?,F在,另一個互連網的巨人,eBay,給我們提供了其架構的一些資料(譯者注:指的是"一天十億次的訪問-采用Core J2EE Pattern架構的J2EE 系統"這篇文章)。
??????? 這篇文章提供了很多信息。然而,我們將只對那些獨特的和我感興趣的那部分進行評論。
??????? 給我留下深刻印象是eBay站點的99.92%的可用性和380M page的頁面數據。除此之外,每周近3萬行代碼的改動,清楚明白地告訴我們ebay的java代碼的高度擴展性。
??????? eBay使用J2EE技術是如何做到這些的。eBay可擴展性的部分如下:
?
????????????? Judicious use of server-side state
????????????? No server affinity
????????????? Functional server pools
????????????? Horizontal and vertical database partitioning

??????? eBay取得數據訪問的線性擴展的做法是非常讓人感興趣的。他們提到使用"定制的O-R mapping" 來支持本地Cache和全局Cache、lazy loading, fetch sets (deep and shallow)以及讀取和提交更新的子集。 而且,他們只使用bean管理的事務以及使用數據庫的自動提交和O-R mapping來route不同的數據源.
?????? 有幾個事情是非常令人吃驚的。第一,完全不使用Entity Beans,只使用他自己的O-R mapping工具(Hibernate anyone?)。 第二、基于Use-Case的應用服務器劃分。第三、數據庫的劃分也是基于Use-Case。最后是系統的無狀態本性以及明顯不使用集群技術。

?????? 下面是關于服務器狀態的引用:
?????? 基本上我們沒有真正地使用server-side state。我們可能使用它,但現在我們并沒有找到使用它的理由。....。如果需要狀態化的話,我們把狀態放到數據庫中;需要的時候我們再從數據庫中取。我們不必使用集群。也就不用為集群做任何工作。

??????? 總之,你自己不必為架構一臺有狀態的服務器所困擾,更進一步,忘掉集群,你不需要它。現在看看功能劃分:
?
?????? 我們有一組或者一批機器,上面運行的應用是某個具體的use case,比如搜索功能有他們自己的服務器群,我們可以采用不同的調優策略,原因是瀏覽商品這個基本上是只讀的用例和賣一件商品這個讀寫的用例在執行的時候是不同。在過去四五年我們一直采用水平數據庫劃分達到我們需要的可用性和線性擴展性。

??????? 總之,不要把你的應用和數據庫放在一個giant machine,僅僅使用servers pools,每個pools對應一個Use Case. 聽起來是否類似Google的策略。

??????? 下面是關于水平劃分的一些介紹:
???????? 基于內容的路由可以實現系統的水平線性擴展。所以,想象一下,如果eBay某天擁有6000萬種商品,我們不必把這些數據存儲到一臺超級Sun服務器上。.....也許我們可以把這些數據庫放到許多臺Sun服務器,但是我們怎么取到我們需要的數據呢?eBay提出了基于內容路由的方法. 這種方法通過一定的規則,從20臺物理服務器中找到我需要的數據。更cool的事情是這里還定義了failover的策略。

??????? 最后,下面一句話描述了未來采用更加松散耦合的架構:
?
?????? 使用消息系統來耦合不同的Use Case是我們研究的內容。

??????? 是不是覺得很奇怪,最初這篇文章是介紹J2EE設計模式的?關鍵的線性擴展的思想幾乎和Patterns無關。是的,eBay采用設計模式組織他們的代碼。然而過分強調設計模式將失去對整體的把握。eBay架構關鍵的思想是無狀態的設計,使用靈活的,高度優化的 OR-mapping 層以及服務器基于use cases劃分。設計模式是好的,然而不能期望它使應用具有線性擴展性。

??????? 總之,eBay和Google的例子表明以Use-Case為基礎組成的服務器pools的架構比幾個大型計算機證明是具有更好線性擴展性的和可用性。當然,廠商害怕聽到這樣的結論。然而,部署這么多服務器的最大麻煩是如何管理好他們。-)


?

我的總結:
??????? ?eBay
采用設計模式達到eBay架構的分層,各層(表示層、商業邏輯層、數據訪問層)之間松散耦合,職責明確,分層提高了代碼的擴展性和程序開發的效率。
??????? ?eBay
采用無狀態的設計,靈活的、高度優化的 OR-mapping 層以及服務器基于use cases劃分,達到應用之間的松散耦合,提高系統的線性擴展性。
???????
為什么要求系統具有可線性擴展,目的就是當網站的訪問量上升的時候,我們可以不用改動系統的任何代碼,僅僅通過增加服務器就可以提高整個網站的支撐量。