軟件測試之用XML、XQuery和XML數據庫技術加速SOA (1) SOA 架構
關鍵字:XML、XQuery和XML SOA 很多軟件架構師在面向服務體系結構(SOA)設計中使用 XML,雖然沒有一種 SOA 標準要求在 SOA 中使用 XML 或者提供相關指南。因此,軟件開發社區做了很多實驗和調查來發現定義服務端點和消息定義(模式)的最佳方式。這些方法大多數都會帶來了糟糕的性能和可伸縮性。
比如,最早提出用 SOA 實現 ebXML 的 General Motors Corp.,其最初的設計使用的是 Universal Business Language (UBL),建立的 XML 消息有 150,000 字節到 10 兆字節甚至更大。2004 年,我的性能測試公司 PushToTest 認為當時的 Java™ 應用程序服務器沒有提供足夠的吞吐量,在 GM Web Services Performance Benchmark 研究中提出了可伸縮性和性能問題。
當時基于 XML 的 Web 服務技術還非常新,我認為新一代應用程序服務器技術會解決性能問題。但大部分問題仍然存在。
Web 服務吞吐量問題和復雜的 XML
2005 年,PushToTest 完成了一項新的 SOA 性能研究(請參閱參考資料)表明,在處理復雜的 XML 消息時,使用當前 Java 應用程序服務器構建的應用程序其性能很差,不足以投入生產。是發現的問題和以前研究中的問題相同:
簡單對象訪問協議(SOAP)綁定(代理)低效而緩慢。
每次請求都需要一組全新的資源(對象、CPU 和網絡帶寬)來處理響應。沒有緩沖模式。
使用關系數據庫技術存儲 XML 數據非常慢而且沒有可伸縮性。
為了了解這三個問題,設想一下軟件開發人員如何使用 J2EE 應用程序服務器工具構建和部署 XML 服務。
圖 1. WSDL 定義的例子
雖然可以使用使用不同技術建立基于 XML 的 Web 服務,但我發現多數開發人員更愿意從服務的 Web Services Description Language (WSDL) 定義開始。Java 應用程序服務器提供了輸入 WSDL定義和生成代理類的工具。代理器接收 SOAP 請求并把請求轉發給 Java 對象或 Enterprise Java Bean (EJB) 進行處理。SOAP 綁定(代理器)是一種 Java 類,可通過 servlet 接口調用它。
圖 2. Java 方法調用
圖 2 說明了 Web 服務消費者如何向服務發出 SOAP 請求。SOAP 綁定對 SOAP 消息體中的 XML 內容進行反序列化。這個過程需要進行大量的處理,非常復雜,因為消息體常常包含復雜的數據類型。比如,消費者可能向服務發送包含多個值的散列表。SOAP 綁定需要解碼散列表的內容,對每個值創建 Java 對象的實例。散列表還可能包含其他散列表,因此解碼 SOAP 消息內容不是一件容易的事。如果不相信的話,請看一看 Apache Axis 反序列化器的源代碼。
SOAP 綁定實例化包含 SOAP 消息體內容的 Java Request 對象。SOAP 綁定調用目標類中的目標方法,并將 Request 對象作為參數傳遞。目標 EJB 或 Java 對象提供所有必要的處理來建立對請求的響應。SOAP 綁定將 EJB 或 Java 對象返回的值序列化到 SOAP 響應消息中。SOAP 綁定將響應對象中的值解碼成能夠序列化到 SOAP 響應消息中的值需要經過同樣復雜的過程。
通過研究用流行的 Java 應用程序服務器工具創建的 SOAP 綁定,我發現了以下問題:
應用程序服務器工具創建的 SOAP 綁定效率很低。比如,我發現某些 SOAP 綁定創建 SOAP 請求的多個副本,每個請求都實例化為 String 對象 —— 這樣做并沒有明顯的理由。一些 SOAP 綁定創建了 15,000 個 Java 對象來反序列化消息體中包含 500 個元素的 SOAP 請求。
在配備有雙 CPU 3.0 GHz Intel Xeon 處理器的服務器上,我發現在處理有效負荷 10,000 字節、包含 50 個元素的簡單 SOAP 消息時,每秒處理的事務為 15 到 20 個(TPS)。隨著 SOAP 消息復雜性和大小的增加,我發現會造成明顯的伸縮性和性能問題。有效負荷 100,000 字節、包含 750 個元素的 SOAP 消息會把吞吐量降低到 1.5 TPS。SOAP 消息體中元素個數越多,每個元素嵌套越深,問題就會越嚴重。
性能問題在 SOA 設計中會引起連鎖反應。SOA 是一種組件軟件重用技術。一個服務通常調用其他服務來確定對消費者請求的響應,從而形成一個調用鏈。
圖 3. 消費者
不僅僅是一個服務的性能問題,每個服務在序列化、反序列化請求和響應的時候都會增加同樣的開銷。隨著服務調用層次的增加,性能問題也成倍增加。
文章來源于領測軟件測試網 http://www.kjueaiud.com/