Pergunta

Estou trabalhando em um serviço da Web no momento e existe a possibilidade de os resultados retornados serem muito grandes (> 5 MB).

É perfeitamente válido que esse conjunto de dados seja tão grande e o serviço da Web possa ser chamado de sincronizado ou assíncrono, mas estou me perguntando o que as pessoas pensam sobre o seguinte:

  1. Se a conexão for perdida, todo o conjunto de resultados deverá ser regenerado e enviado novamente.Existe alguma maneira de fazer algum tipo de "retomar" se a conexão for perdida ou redefinida?

  2. Enviar um conjunto de resultados tão grande é apropriado?Seria melhor implementar algum tipo de "paginação" onde o conjunto de resultados fosse gerado e armazenado no servidor e o cliente pudesse baixar pedaços do conjunto de resultados em quantidades menores e remontar o conjunto no final?

Foi útil?

Solução

Eu vi todas as três abordagens, paginada , armazenar e recuperar e esforço gigantesco .

Eu acho que a solução para o seu problema depende em certa medida, por que o seu conjunto de resultados é tão grande e como ele é gerado. Será que os seus resultados crescer ao longo do tempo, eles são calculados de uma só vez e depois empurrado, quer transmiti-los de volta assim que você tê-los?

Paginação Abordagem

Na minha experiência, usando uma abordagem de paginação é apropriado quando o cliente precisa de acesso rápido para pedaços de tamanho razoável do conjunto de resultados semelhante a páginas nos resultados de pesquisa. Considerações aqui são chattiness geral do seu protocolo, cache de todo o conjunto de resultados entre solicitações de página cliente, e / ou o tempo de processamento necessário para gerar uma página de resultados.

loja e recuperar

loja e recuperar é útil quando os resultados não são de acesso aleatório eo conjunto de resultados cresce em tamanho como a consulta é processada. Questões a serem consideradas aqui estão complexidade para os clientes e se você pode fornecer ao usuário com resultados parciais ou se você precisa calcular todos os resultados antes de retornar alguma coisa para o cliente (acho que a classificação de resultados dos motores de busca distribuídos).

esforço gigantesco

A abordagem esforço gigantesco é quase certamente falho. Mesmo que o cliente precisa de toda a informação e ele precisa ser empurrado em um conjunto de resultados monolítico, eu recomendaria fazer a abordagem de WS-ReliableMessaging (diretamente ou através de sua própria versão simplificada) e chunking seus resultados. Ao fazer isso você

  1. garantir que as peças chegar ao cliente
  2. pode descartar o pedaço assim que obter um recibo do cliente
  3. pode reduzir os possíveis problemas com o consumo de memória de ter que manter 5MB de XML, DOM, ou o que quer na memória (supondo que você não está processando os resultados de uma forma streaming) sobre os lados cliente e servidor.

Como outros, porém, não fazer nada até que você sabe que seu tamanho conjunto de resultados, como ela é gerada, e desempenho global a ser questões reais.

Outras dicas

Não há nenhuma lei dura contra 5 Mb como um tamanho conjunto de resultados. Mais de 400 Mb pode ser duro para enviar .

Você obterá automaticamente assíncrona manipuladores (desde que você está usando .net)

implementar algum tipo de "paging", onde o conjunto de resultados é gerado e armazenado no servidor e a lata cliente, então, baixar pedaços do conjunto de resultados em quantidades menores e re-montar o set em sua extremidade

Isso já está acontecendo para você - ele é chamado TCP / IP ;-) Re-implementação que poderia ser um exagero

.

Da mesma forma -

inteira de resultados terão de ser regenerado e enviado novamente

Se for MS-SQL, por exemplo, que está gerando a maior parte do conjunto de resultados - em seguida, re-geração que vai tirar proveito de alguns cacheing implícita no SQL Server e as gerações subseqüentes será mais rápido.

Até certo ponto, você pode começar afastado com não se preocupar com estes problemas, até que a superfície como problemas 'reais' -. Porque a plataforma (s) que você está usando cuidar de um monte de gargalos de desempenho para você

De certa forma eu discordo com o comentário de secretGeek:

Isso já está acontecendo para você - ele é chamado TCP / IP ;-) Re-implementação que poderia ser um exagero

.

Há momentos em que você pode querer fazer apenas isso, mas realmente apenas a partir de uma perspectiva UI. Se você implementar alguma forma, quer transmitir os dados para o cliente (através de algo como um mecanismo pushlets), ou pedaço lo em páginas como você sugere, então você pode carregar alguns realmente pequeno subconjunto no cliente e, em seguida, lentamente construir a interface do usuário com o valor total dos dados.

Isto faz para um vigarista, UI mais rápido (do ponto de vista do usuário), mas você tem que avaliar se o esforço extra vai valer a pena ... porque eu não acho que vai ser uma quantidade insignificante de trabalho.

Assim, parece que você estaria interessado em uma solução que acrescenta 'começando número recorde' e parâmetro 'número registro final' para o seu método de web. (Ou 'número de página' e 'resultados por página')

Isto não deve ser muito difícil, se o armazenamento de backup é sql server (ou mesmo mysql), como eles têm construído em apoio a numeração de linha.

Apesar de isso, você deve ser capaz de evitar fazer qualquer gerenciamento de sessão no servidor, evitar qualquer caching explícita do conjunto de resultados, e confiar apenas em cache do armazenamento de backup para manter sua vida simples.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top