É uma boa idéia mesclar várias solicitações HTTP para economizar largura de banda?


16

Estou preparando um aplicativo de página única que às vezes seria usado em uma conexão móvel lenta. Parte de sua parte é bastante pesada em termos de solicitações de API (buscando dez recursos diferentes para uma nova exibição na tela).

Agora, é uma boa idéia mesclar esses serviços com um que forneça todos os dados necessários, mas não seja "puro" em termos de princípios REST? Há ganhos de desempenho significativos a serem esperados?


3
A "boa idéia" é aquela que atende adequadamente aos requisitos de desempenho e manutenção do seu software.
Robert Harvey

1
O benefício da combinação de respostas pode não ser tão significativo, embora você garanta a utilização de um keep-alive e garanta que os pedidos que podem ser carregados em paralelo sejam carregados sem bloquear um ao outro. Meça, meça, meça. Não adivinhe.
Lie Ryan

FAÇA-O, além de economizar largura de banda, permitirá reordenar as operações de E / S para melhorar o desempenho de E / S. Isso geralmente é um gargalo no sistema e melhora tremendamente o rendimento.
InformedA

Respostas:


18

Uma das vantagens do REST é a capacidade de armazenar em cache as solicitações por caches http tradicionais (assumindo que sejam solicitações armazenáveis ​​em cache).

Quando você tem solicitações únicas, maiores, usadas com menos frequência e possivelmente diferentes (vou buscar itens a,b,c,ddesta vez e da a,b,d,epróxima vez), você aumenta a probabilidade de a solicitação ser um erro de cache e expirar de um cache que pode ser sentado em algum lugar entre você e a fonte.

Dado os dois conjuntos de solicitações mencionados acima, a segunda requisição pode ter uma taxa de acerto de cache de 75% e ser uma busca substancialmente mais rápida e, em vez das quatro coisas.

Observe que isso pode não ser imediatamente aparente para as pessoas que o usam, pois a pessoa que faz o primeiro conjunto de solicitações de falta de cache ainda terá as falhas de cache.

Isso não quer dizer que seria ideal em uma conexão de rede móvel em que é menos provável que ocorram hits de cache não local. Mas para pontos quentes ou outras situações de wifi, os acertos do cache podem ser muito mais úteis.

Muito disso, novamente, está sujeito ao funcionamento do seu aplicativo. Está pedindo todos esses dados na inicialização? ou estamos falando de um carregamento de página em que as expectativas de tempo de resposta são diferentes?

O ideal é testar isso para ver como o seu aplicativo é pré-formado em várias situações. Considere a possibilidade de configurar uma situação em que você vinculou seu dispositivo móvel a uma rede wifi local que você pode monitorar (que é apenas o primeiro hit do google) e simular uma conexão de Internet ruim para ver como as coisas realmente funcionam (ou não) e qual tem o melhor desempenho.


1
+1 por mencionar o cache. Quanto mais recursos você solicitar em uma solicitação, maior será a chance de uma falta de cache, mas menor será a sobrecarga de HTTP.
Brandon

8

Sua intuição é um pouco correta - em geral, fazer menos solicitações é certamente preferível; APIs robustas tendem a ser melhores. Especialmente com conectividade irregular, onde você pode ver algum trabalho e outros falharem ao criar cenários de fallback pesadelos, já que nada pode depender de nada.

Há uma grande ressalva - você pode ficar muito robusto e suas chamadas e respostas ficam inchadas. Por exemplo, pode fazer sentido receber uma grande ligação quando você acessa uma página pela primeira vez e, em seguida, receber atualizações em pequenas porções, em vez de forçar uma atualização de página grande toda vez que você deseja dados.

Ou, você desejará fazer as duas coisas com toda a probabilidade.


5

Confira este artigo do Dropbox Tech Blog .

Lá eles descrevem em detalhes o porquê e como eles implementaram exatamente a solução que você propôs para recuperar as miniaturas de todas as suas fotos. Deve-se dizer que eles medem o desempenho para ver se vale a pena, e aparentemente vale a pena.

Pequeno resumo:

O site do Dropbox precisa carregar centenas de miniaturas. Devido a limitações em alguns navegadores, nem todas as miniaturas são carregadas em paralelo (as solicitações estão na fila). Eles queriam usar o SPDY , mas não conseguiram, porque partes do sistema ainda não o suportam. No final, eles usaram solicitações em lote por HTTP, que retornam várias miniaturas por resposta em um formato compactado. A melhoria geral do tempo de carregamento da página foi de 40%, de acordo com os resultados.


Mas eles dizem que é uma solução temporária.
ymajoros

3

Em resumo: sua abordagem é um pouco correta e pode se beneficiar de um serviço de wrapper.

Este serviço combinará chamadas únicas existentes em um método do lado do serviço. Faça isso combinando chamadas do cliente para o lado do serviço e utilizando todas as chamadas simples, atômicas e repousantes que você provavelmente já tem.

Assim, você continuaria a se beneficiar do REST como a capacidade de armazenar em cache os pedidos.

No entanto, no ponto final, tudo se resume ao desempenho da infraestrutura de serviço / servidor e ao ambiente do cliente que deve consumi-lo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.