2009-12-21 145 views
1

在我們Web服務的性能測試中,我們發現響應生成的流量超出了我們的預期。我們正在查詢包含行和列的數據庫和加載列表。優化Web服務的XML響應

該列的類型是AnyType所以在響應中需要一個類型信息。因此,Web服務引擎(Axis2或JAXWS)多次添加命名空間信息。請看下面的例子響應:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <ns3:loadListResponse xmlns:ns3="http://example.com/test/service-types-1.0" 
     xmlns:ns2="http://example.com/lists/lists-types-1.0" > 
     <ns3:value> 
      <ns2:row> 
       <ns2:column xsi:type="xs:int" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">12345</ns2:column> 
       <ns2:column xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">XYZ</ns2:column> 
       <ns2:column xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> 
       <ns2:column xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">ABC</ns2:column> 
      </ns2:row> 
      <ns2:row> 
       <ns2:column xsi:type="xs:int" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">32345</ns2:column> 
       <ns2:column xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">OPC</ns2:column> 
       <ns2:column xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> 
       <ns2:column xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">QWE</ns2:column> 
      </ns2:row> 
      . 
      . 
      . 
     </ns3:value> 
     </ns3:loadListResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

我想優化由在頂部加入所需的命名空間和從每一列中除去他們這個XML響應(一般有每行約30列)。結果應該是這樣的:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <soapenv:Body> 
     <ns3:loadListResponse xmlns:ns3="http://example.com/test/service-types-1.0" 
     xmlns:ns2="http://example.com/lists/lists-types-1.0" > 
     <ns3:value> 
      <ns2:row> 
       <ns2:column xsi:type="xs:int" >12345</ns2:column> 
       <ns2:column xsi:type="xs:string" >XYZ</ns2:column> 
       <ns2:column xsi:nil="true" /> 
       <ns2:column xsi:type="xs:string" >ABC</ns2:column> 
      </ns2:row> 
      <ns2:row> 
       <ns2:column xsi:type="xs:int" >32345</ns2:column> 
       <ns2:column xsi:type="xs:string" >OPC</ns2:column> 
       <ns2:column xsi:nil="true" /> 
       <ns2:column xsi:type="xs:string" >QWE</ns2:column> 
      </ns2:row> 
      . 
      . 
      . 
     </ns3:value> 
     </ns3:loadListResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

你會怎麼做這樣的事情?

有沒有辦法告訴Axis2或JAXWS這樣做?

或者我是否需要手動操作生成的XML?

回答

3

你有沒有考慮嘗試壓縮響應,而不是以適當的透明方式?這可能更容易做到,並且對於所有重複的數據都會非常有效。

+0

是的,我們正在考慮這一點。在服務器端有一個Apache,所以mod_deflate應該做的工作......但.NET客戶端需要能夠處理壓縮的響應。 – 2009-12-21 10:25:47

0

AXIS 1.x的servlet compression filter的示例。

本指南介紹瞭如何在Apache Axis中使用SOAP壓縮。請求和響應消息都被壓縮。爲了在客戶端壓縮和解壓SOAP消息,使用了一個gzip的Axis擴展。服務器端的對應部分是一個Servlet過濾器。

1

如果您對您的Web服務的傳輸和/或處理效率的關注,你應該考慮啓用Fast Infoset

的Fast Infoset(或FI)是一個 國際標準,規定 一個用於XML 信息集(XML信息集)的二進制編碼格式作爲 替代XML格式的文檔 格式。它旨在提供比 基於文本的XML格式更多的 高效序列化。

我們可以把FI作爲gzip的對XML, 雖然FI旨在優化兩者 文件大小和處理 性能,而gzip的優化 只有大小。

它對高容量網絡服務的影響是戲劇性的,我現在在可能的情況下使用它作爲理所當然的事情。

它受到Axis2JAX-WS的支持。

+0

我們有一個。需要處理響應的.NET客戶端......這可以通過Fast Infoset完成嗎? – 2009-12-21 10:29:00

+0

FastInfoset是一個微軟發明,所以這不應該是一個問題。 – skaffman 2009-12-21 10:37:50

+0

它看起來像.NET,它是一個[商業解決方案](http://www.noemax.com/products/fastinfoset/index.html),你必須付錢。 – 2014-03-20 02:50:47