none
Como melhorar a performance na transmissão de dados (Pacote de dados muito grande) RRS feed

  • Pergunta

  • Ola pessoal

    Estou com um problema de performance na transmissão dos dados pelo wcf. Estou pesquisando uma forma de compactar os dados antes de transmitir ou então dividir um pacote muito grande em varios pacotes pequnos. Alguem teria uma sugestão?

    T+
    quarta-feira, 17 de março de 2010 14:42

Respostas

Todas as Respostas

  • Boas Marcio,

    No WCF já temos uma funcionalidade que é a possibilidade de enviar/retornar Streams. Com ele, ao invés da mensagem ser totalmente "bufferizada", de pacotes em pacotes, o resultado já vai sendo enviado ao cliente.

    Esta funcionalidade tem duas características que talvez inviabilize a sua utilização: você não pode utilizar coisas como mensagens confiáveis ou segurança em nível de mensagem, pois elas dependem da mensagem inteira para efetuar a validação, algo que não acontece quando se utiliza Streams (O Chunking Channel (msdn.microsoft.com/en-us/library/aa717050.aspx) resolve este problema). A segunda característica é que os parâmetros (de entrada e retorno dos métodos) devem ser do tipo System.IO.Stream. Só que isso é legal quando você está transferindo arquivos de um lado ao outro; quando temos objetos, apesar de você conseguir serializá-los, não fica muito intuitivo.

    O que geralmente tenho adotado, é a possibilidade de criar contratos que suportem paginação de resultados. Como muitas vezes, meus serviços que afetam o comportamento da minha estrutura, são separados daqueles que fornecem dados para relatórios (CQS), não vejo problema em ter nestes serviços, características que são direcionadas para UI.

    Independentemente do modelo escolhido, um ponto importante a ser considerado é a capacidade de compressão. Nativamente o WCF não dá suporte à isso, mas quando o serviço é hospedado no IIS, você pode tirar proveito da compressão dinâmica que o IIS fornece e, consequentemente, todas as respostas serão enviadas ao cliente comprimidas.
    http://www.israelaece.com
    quarta-feira, 17 de março de 2010 15:56
    Moderador
  • Quando voce fala "criar contratos que suportem paginação de resultados ",  como é isso?
    quarta-feira, 17 de março de 2010 16:47
  • Boas Marcio,

    Basicamente isso:

    Clientes[] RecuperarClientes(string cidade, string estado, int paginaAtual, int quantidadeDeRegistrosPorPagina);

    ou

    Clientes[] RecuperarClientes(FiltrosDePesquisa filtros, int paginaAtual, int quantidadeDeRegistrosPorPagina);
    http://www.israelaece.com
    quarta-feira, 17 de março de 2010 17:58
    Moderador
  • Humm, deixa eu ver se entendi.

    Na realidade este controle é feito programaticamente ou seja no braço mesmo? Ou existe alguma configuração (decoração) que se deve fazer nos contratos?
    quarta-feira, 17 de março de 2010 19:12
  • Boas Marcio,

    No exemplo que te dei, sim, terá que efetuar o controle manualmente. Eu acho que isso é a melhor alternativa, pois muitas vezes você retorno vários registros, e o usuário quer ver apenas uma porção deles.
    http://www.israelaece.com
    quarta-feira, 17 de março de 2010 19:35
    Moderador
  • Entendi.

    Outra coisa, voce acha que se eu mudar o meu servidor de winform para console application ele pode melhorar alguma coisa com relação a performance ja que o console application não tem a parte gráfica para se preocupar?
    quinta-feira, 18 de março de 2010 11:51
  • Boas Marcio,

    O ideal seria hospedar no WAS (que é um serviço do IIS), ou em um Windows Service.
    http://www.israelaece.com
    • Marcado como Resposta marcio.chiaveli quinta-feira, 18 de março de 2010 13:29
    quinta-feira, 18 de março de 2010 13:15
    Moderador
  • Ok Obrigado Israel.
    quinta-feira, 18 de março de 2010 13:30