domingo, 18 de abril de 2010

Novidade: Descompressão automática no WCF 4.0

Participei do survey realizado pela sobre custom channels no WCF. Essa semana tive resposta à minha colaboração, onde tive o espaço para comentar sobre compressão.

Enfim, é necessário estudar alternativas viáveis para troca de informações com o webservice, que muitas vezes passa pelo link mais lento da solução, ou seja, a internet. A Microsoft produziu um sample abordando esta questão, no caso, uma implementação de um encoder que utiliza compressão gzip, o próprio framework fornece suporte para isso. Eu implementei este encoder na solução, mas o desempenho de compressão não ficou nem perto da solução original desenvolvida em outra plataforma.

Exemplo de channel stack: o encoder Gzip fica logo acima do Transport e comprime dados de outro encoder



Duas coisas diferem da implementação sem WCF para a com WCF. A primeira é o formato da mensagem. Sem WCF, um arquivo XML é montado com todos os dados. Com WCF temos uma lista de objetos serializada em formato binário. O arquivo XML tende a ser maior, porém o formato é mais entrópico. A segunda diferença é o componente de compressão. Enquanto sem WCF usamos um componente de terceiros que faz compressão zip, no WCF o encoder usa a compressão disponível no framework, o gzip/deflate. Ambos os métodos (zip, deflate) usam dicionário, muito bons para texto. Não medi o tempo de execução, mas acredito que reduzindo a quantidade de dados sendo transmitidos reduz o tempo total da operação, que é dominada pelo tempo gasto na rede.




Método Compressão
Zip + XML 95%
Gzip + binary 75%


A novidade no WCF 4.0 é a descompressão automática no lado client, mas restrições se aplicam: o recurso é baseado no suporte intrínseco à compressão encontrado no protocolo HTTP, então por hora somente este transporte possibilita isto. A mensagem de request contém o header Accept-Encoding, e a response contém Content-Encoding. Ainda não testei isso, mas caso eu venha a fazê-lo eu postarei resultados aqui.

GET /MyService HTTP/1.1
Host: localhost:8080
User-Agent: Microsoft .NET
Accept-Encoding: gzip, deflate


HTTP/1.1 200 OK
Content-Type: text/xml
Last-Modified: Wed, 18 Apr 2010 04:15:54 GMT
Content-Encoding: gzip

Mais informações e créditos:
  • Como implementar o compression encoder aqui
  • A imagem foi extraída desta página
  • Também é possível usar outros compressores, como o DotNetZip, desde que o client consiga decodificá-lo

Nenhum comentário:

Postar um comentário