Maneiras melhores do que os métodos tradicionais de votação

10

Atualmente, estou em um ambiente AngularJS / Javascript.

Atualmente, o aplicativo usa o método de pesquisa (ou seja, para recuperar novos dados do servidor em uma quantidade fixa de segundos).

Isso é bastante cansativo e não recupera o resultado mais recente imediatamente. Supondo que o servidor esteja usando o ASMX para funções de serviço da web e, se possível, sem uma grande revisão, como posso melhorar melhor a eficiência do aplicativo?

Editar 1:

Ao taxar, quero dizer que o servidor precisaria exibir tabelas SQL diferentes e dados e outras coisas associadas, o que significa processamento de dados complexo que, se houver muitos usuários simultâneos, receio que possam haver possíveis problemas com o desempenho do servidor no futuro.

Os dados mais recentes não serão recuperados, pois atualmente o aplicativo está usando o tipo de chamadas https de solicitação-resposta.

Posso melhorar mais no lado de aplicativos móveis, mas não consigo modificar muito no lado do servidor, além dos arquivos de serviço da web do servidor.

Gene
fonte

Respostas:

10

Se por "tradicional" você quer dizer todos os clientes que martelam o servidor o mais rápido possível, eu posso ajudar no nível da arquitetura.

O design apropriado depende de onde seu servidor se enquadra nessa grade:

Control \ Resources : Sufficient | Insufficient
Customizable        :     SC     |     IC
Untouchable         :     SU     |     IU
  • SC: Faça o servidor seguir o padrão do observador . Permita que os clientes se registrem como observadores.

  • IC: permita apenas que um sistema proxy se registre no servidor. Clientes se registram com proxy.

  • SU: permite apenas que um sistema proxy faça uma pesquisa no servidor. Clientes se registram com proxy.

  • UI: Permitir apenas que um sistema proxy faça uma pesquisa no servidor. Clientes se registram com proxy.

Um proxy que segue o padrão do observador pode resolver problemas de personalização e recursos. Isso funciona tão bem na internet quanto entre objetos. Quando você se registra, está pedindo para ser chamado quando algo acontece. Ouça em uma porta e você está pronto para ser chamado. ajax, REST, UDP, qualquer que seja.

O problema da pesquisa é que o observador controla quando a chamada acontece e ainda não sabe quando o estado muda, fazendo muitas chamadas desnecessárias. Isso consome recursos, especialmente quando há muitos observadores. A chave para lidar com a pesquisa é: o mais rápido possível, obtenha a direção das chamadas que vão do ponto de mudança de estado para o observador. Em seguida, as chamadas acontecem quando são necessárias. Não quando não estão.

Se você tiver chamadas de sondagem desta maneira:

  • Servidor <=== Muitos observadores

Qualquer uma dessas seria uma maneira melhor de detectar alterações:

  • SC: Servidor ===> Muitos observadores

  • IC: Servidor ===> Um proxy ===> Muitos observadores

  • SU: Servidor <=== Um proxy ===> Muitos observadores

  • UI: Servidor <=== Um proxy ===> Muitos observadores

candied_orange
fonte
7
Você perdeu o cenário de "correção preguiçosa": basta criar um proxy leve entre as partes e continuar pesquisando em todos os lugares. O principal problema de desempenho provavelmente vem do servidor executando muitos trabalhos complexos em cada consulta. Usando o proxy de controle de taxa (nginx, memcached, estrutura LRU na memória, qualquer que seja), é possível obter melhores taxas de resposta sem chamar os cálculos do servidor em cada consulta Javascript.
User1643723
@CandiedOrange, em termos de observadores, seria algo como SignalR?
Gene
@ Gene se seu hype pode ser acreditado, então sim. Eles estão falando sobre fazer a mesma coisa.
Candied_orange 22/05
6

Você pode usar eventos enviados pelo servidor como uma alternativa à pesquisa.

Em vez de solicitar ao servidor novos dados a cada n segundos, abra uma conexão dedicada e faça com que ele envie seus novos dados quando estiverem disponíveis!

A conexão permanecerá aberta até que seja explicitamente fechada pelo cliente ou pelo servidor (ou por seu término repentino).

Você pode configurar o servidor para transmitir dados para o cliente em intervalos fixos ou em horários específicos no servidor (digamos, quando um objeto muda de estado ou quando um agendador dispara um trabalho ou quando).

Você pode definir diferentes tipos de eventos e ter rotinas diferentes para lidar com diferentes tipos de eventos.

No lado do servidor, você pode manter uma fila de usuários atualmente inscritos no seu tipo de aplicativo / evento. Quando um evento é criado, o servidor o transmite a todos os usuários na fila. Estruturas como Jersey2 já implementam essa abordagem usando um objeto Broadcaster .

No lado do cliente, você precisará escrever um serviço que ouvirá os eventos enviados pelo servidor em um URL específico .

Ao entrar em um estado / rota, você deverá assinar um tipo de servidor e cancelar a assinatura $destroypara evitar vazamentos.

svarog
fonte
Oi svarog, Podemos obter multicast usando eventos enviados pelo servidor ?, Além do Jesey 2, qualquer outra implementação de cliente está disponível ?, estou procurando pelo cliente http2 que pode assinar eventos SSE.
kapil das
3

Eles são websockets: são uma exersão de HTTP, funcionam na mesma porta.

Ele permite a comunicação bidirecional entre cliente e servidor e, é claro, existe uma integração angularjs disponível para isso.

Caso contrário, no lado de back office, se você observar o Spring em Java, existem outras maneiras de fazer isso:

  • Votação longa
  • STOMP
  • ...

Este link covevr websocket e outros métodos adaptados ao que você precisa.

Observe que, se você não possui Spring / Java, ainda deve lê-lo e procurar uma solução equivalente em sua pilha de tecnologias.

Walfrat
fonte
Qual é o número máximo de conexões de soquete aberto que um servidor pode manipular simultaneamente? Os websockets são escaláveis?
thewebjackal 28/02
Que eu não sei, é muito provável que haja algo capaz de carregar o equilíbrio, mas eu não sei.
Walfrat 6/03
1

Você precisa definir melhor coisas como "bastante exigente" e explorar por que ele não recupera o resultado mais recente imediatamente. Essas são perguntas que provavelmente estão acontecendo independentemente de você estar pesquisando ou não com seu cliente.

Dito isto, com um front end baseado em navegador, você basicamente tem duas opções se quiser permanecer no javascript nativo: polling (como você está fazendo, ou possivelmente fazendo uma sondagem longa) ou soquetes da web. Eu nunca vi soquetes da Web executados com ASMX antes (sem dizer que não pode ser feito, apenas que eu não tenho experiência lá, então não sei o quão difícil seria para você reimplementar). Além disso, se você estiver tendo problemas de desempenho ou precisão, como eu disse, eles ainda podem estar lá, mesmo com o uso de soquetes da web.

Paulo
fonte
oi pls ver a atualização!
Gene