Оптимизация XML-ответа веб-сервиса - PullRequest
1 голос
/ 21 декабря 2009

В тестах производительности нашего веб-сервиса мы обнаружили, что трафик , сгенерированный ответом, намного превзошел наши ожидания. Мы запрашиваем базу данных и загружаем списки, состоящие из строк и столбцов.

Тип столбца AnyType , поэтому в ответе должна быть информация о типе. Поэтому механизм веб-службы (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 ]

3 голосов
/ 21 декабря 2009

Рассматривали ли вы попытку сжатия ответа соответствующим образом прозрачным способом? Это может быть легче сделать, и было бы очень эффективно со всеми этими повторяющимися данными.

1 голос
/ 21 декабря 2009

Если у вас есть сомнения относительно эффективности транспортировки и / или обработки вашего веб-сервиса, вам следует рассмотреть возможность включения Fast Infoset :

Fast Infoset (или FI) является международный стандарт, который определяет двоичный формат кодирования для XML Информационный набор (XML Infoset) как альтернатива XML-документу формат. Он стремится обеспечить больше эффективная сериализация, чем текстовый формат XML.

Можно думать о FI как о gzip для XML, хотя FI стремится оптимизировать как размер документа и обработка производительность, тогда как gzip оптимизирует только размер.

Его влияние на большие объемы веб-сервисов впечатляет, и теперь я использую его как само собой разумеющееся, где это возможно.

Поддерживается как Axis2 , так и JAX-WS .

0 голосов
/ 21 декабря 2009

Пример фильтра сжатия сервлетов для AXIS 1.x.

В этом руководстве объясняется, как использовать сжатие SOAP с Apache Axis. Сообщения запроса и ответа сжимаются. Для сжатия и распаковки SOAP-сообщений на стороне клиента используется расширение Axis для gzip. Аналогом на стороне сервера является фильтр сервлетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...