Pergunta

Já ouvi alguns desenvolvedores recentemente dizer que eles são simplesmente coisas polling (bancos de dados, arquivos, etc.) para determinar quando algo mudou e, em seguida, executar uma tarefa, como uma importação.

Eu estou realmente contra essa idéia ea sensação de que utilizando a tecnologia disponível, como Remoting , WCF , etc. seria muito melhor do que polling.

No entanto, eu gostaria de identificar as razões pelas quais outras pessoas preferem uma abordagem sobre a outra e, mais importante, como posso convencer os outros que polling está errado neste dia e idade?

Foi útil?

Solução

Polling não é "errado" como tal.

Depende muito de como ela é implementada e com que finalidade. Se você realmente se preocupam com immedatly notificação de uma mudança, é muito eficiente. Seu código fica em malha apertada, constantemente polling (pedir) um recurso se mudou / atualizado. Isto significa que são notificados assim que você pode ser que algo está diferente. Mas, seu código não está fazendo qualquer outra coisa e não há sobrecarga em termos de muitas muitas chamadas para o objeto em questão.

Se você está menos preocupado com a notificação imediata, você pode aumentar o intervalo entre as pesquisas, e isso também pode funcionar bem, mas escolhendo o intervalo correto pode ser difícil. Muito tempo e você pode perder mudanças críticas, muito curto e você está de volta para os problemas do primeiro método.

alternativas, tais como interrupções ou mensagens, etc. pode fornecer um melhor compromisso nestas situações. Você é notificado de uma mudança assim que for praticamente possível, mas esse atraso não é algo que você controla, depende o componente tself sendo oportuna sobre a passagem sobre as mudanças no estado.

O que é "errado" com polling?

  • Pode ser hogging recursos.
  • Pode ser limitante (especialmente se você tem muitas coisas que você quer saber sobre / votação).
  • Pode ser um exagero.

Mas ...

  • Não é inerentemente errado.
  • Pode ser muito eficaz.
  • É muito simples.

Outras dicas

Existem duas razões pelas quais polling pode ser considerado ruim por princípio.

  1. É um desperdício de recursos. É muito provável que você irá verificar se há uma mudança, enquanto nenhuma mudança ocorreu. O ciclos de CPU / gastos largura de banda em esta ação não resulta em uma mudança e, portanto, poderia ter sido melhor gasto em outra coisa.

  2. Polling é feito em um determinado intervalo. Isso significa que você não vai saber que ocorreu uma mudança até a próxima vez que o intervalo tenha passado.

Seria melhor para ser notificado das alterações. Desta forma, você não está de votação para as mudanças que não aconteceram e você vai saber de uma mudança assim que receber a notificação.

Os exemplos de coisas que o uso de votação neste dia e idade:

  • clientes de e-mail verificar novas mensagens (mesmo com IMAP).
  • RSS leitores votação para mudanças para feeds.
  • Os motores de busca pesquisa para alterações nas páginas que eles índice.
  • usuários StackOverflow votação para novas perguntas, por bater 'refresh'; -)
  • clientes
  • Bittorrent sondar o tracker (e uns aos outros, eu acho, com DHT) para mudanças no enxame.
  • Spinlocks em sistemas multi-core pode ser a sincronização mais eficiente entre os núcleos, nos casos em que o atraso é muito curto para que haja tempo para agendar outro segmento neste núcleo, antes que o outro núcleo faz o que nós estamos esperando para .

Às vezes simplesmente não há alguma maneira de obter notificações assíncronas: por exemplo, para substituir RSS com um sistema de push, o servidor teria de saber sobre todo mundo que lê o feed e têm uma maneira de entrar em contato com eles. Esta é uma lista de discussão - precisamente uma das coisas RSS foi projetado para evitar. Daí o fato de que a maioria dos meus exemplos são aplicativos de rede, onde isso é mais provável que seja um problema.

Outras vezes, polling é suficiente barato para o trabalho mesmo quando não há notificação assíncrona.

Para um arquivo local, notificação de alterações é provável que seja a melhor opção, em princípio. Por exemplo, você pode (pode) evitar que o disco a girar para baixo se você está cutucando-o para sempre, embora, novamente o cache OS força. E se você está polling a cada segundo em um arquivo que só muda uma vez por hora, você pode ser desnecessariamente ocupando 0,001% (ou qualquer outro) do poder de processamento da máquina. Isso parece pequena, mas o que acontece quando há 100.000 arquivos que você precisa para pesquisa?

Na prática, porém, a sobrecarga é provável que seja desprezível o que você faz, o que torna difícil a ficar animado sobre a mudança de código que atualmente trabalha. Melhor coisa é que atente para problemas específicos que polling provoca no sistema que pretende alterar - se você encontrar qualquer então aumentar os ao invés de tentar fazer um argumento geral contra todos polling. Se você não encontrar nenhum, então você não pode consertar o que não está quebrado ...

Polling é fácil de fazer, muito fácil, é tão fácil como qualquer código processual. Nem meio de votação você entra no mundo da programação assíncrona, o que não é tão morte cerebral fácil, e pode mesmo tornar-se um desafio às vezes.

E, como com tudo em qualquer sistema, o caminho de menor resistência é normalmente mais comumente tomadas, de modo que sempre haverá programadores usando polling, até mesmo grandes programadores, porque às vezes não há necessidade de coisas complicar com padrões assíncronos.

Eu, pelo menos sempre prosperar para polling evitar, mas às vezes eu faço polling de qualquer forma, especialmente quando os ganhos reais de manipulação assíncrona não são tão grandes, como quando agir contra alguns pequenos dados locais (é claro que você começa um pouco mais rápido , mas os usuários não vai notar a diferença em um caso como este). Portanto, há espaço para ambos metodologias IMHO.

pesquisa de cliente não escala bem como notificações do servidor. Imaginem milhares de clientes pedindo o servidor "quaisquer novos dados?" a cada 5 segundos. Agora imagine o servidor manter uma lista de clientes para notificar de novos dados. Notification Server dimensiona melhor.

Eu acho que as pessoas devem perceber que na maioria dos casos, em algum nível, há polling sendo feito, mesmo no evento ou interromper situações motrizes, mas você está isolado do código real fazendo o polling. Realmente, esta é a situação mais desejável ... isolar-se do implementaion, e apenas lidar com o evento. Mesmo que você deve implementar a votação mesmo, escrever o código para que ele é isolado, e os resultados são tratados independentemente da implementação.

É simples - polling é ruim -. Ineficiente, desperdício de recursos, etc. Há sempre alguma forma de conectividade no lugar que está monitorando para um evento de algum tipo de qualquer maneira, mesmo se 'polling' não é escolhido

Então, por que ir a milha extra e colocar sondagem adicional no lugar.

As chamadas de retorno são a melhor opção - apenas precisa se preocupar em amarrar o callback com seu processo atual. Subjacente, não há votação acontecendo ao ver que a conexão ainda está no lugar de qualquer forma.

Se você continuar telefonando / tocar sua namorada e ela é nunca responde, então por que manter chamando? Basta deixar uma mensagem, e espere até que 'chamadas de volta', ela;)

Eu uso polling ocasionalmente para certas situações (por exemplo, em um jogo, gostaria de consultar o estado do teclado cada quadro), mas nunca em um loop que só faz polling, em vez eu faria polling como uma verificação (tem recurso X mudou? Se sim, fazer algo, caso contrário processo outra coisa e verifique novamente mais tarde). De um modo geral, porém, eu evitar votação em favor de notificações assíncronas.

As razões são que eu não gaste recursos (tempo de CPU, o que for) esperando que algo aconteça (especialmente se esses recursos poderia acelerar essa coisa acontecer, em primeiro lugar). Os casos em que eu uso polling, eu não sentar espera ocioso, eu uso os recursos em outro lugar, por isso é um não-problema (para mim, pelo menos).

Se você é polling para alterações em um arquivo, então eu concordo que você deve usar as notificações do sistema de arquivos que estão disponíveis para quando isso acontece, que estão disponíveis na maioria dos sistemas operacionais agora.

Em um banco de dados que você pode desencadear na atualização / inserção e, em seguida, chamar seu código externo para fazer alguma coisa. No entanto, pode ser que você não tem um requisito para ações imediatas. Por exemplo, você pode precisar apenas de obter dados do banco de dados Um banco de dados para B em uma rede diferente dentro de 15 minutos. Banco de dados B pode não ser acessível a partir da base de dados A, então você acaba fazendo o polling de, ou como um programa autônomo que funciona perto, Banco de Dados B.

Além disso, Polling é uma coisa muito simples de programa. Muitas vezes, é um primeiro passo implementação feito quando restrições de tempo são curtas, e porque ele funciona bem o suficiente, ele permanece.

A coisa sobre polling é que ele funciona! Sua confiável e simples de implementar.

Os custos de pooling pode ser elevado -. Se você estiver digitalizando um banco de dados para mudanças cada minuto quando há apenas duas mudanças um dia você está consumindo uma grande quantidade de recursos para uma muito pequena resultado

No entanto, o problema com qualquer technoligy notificação é que eles são muito mais complexa de implementar e não só eles podem não ser confiáveis, mas (e este é um grande mas) você não pode facilmente dizer quando eles não estão funcionando.

Então, se você fizer queda de votação por algum outro technoligy se certificar de que é utilizável por programadores média e é ultra confiável.

Eu vejo muitas respostas aqui, mas acho que a resposta mais simples é a resposta que eu:

Porque é (geralmente) muito mais simples de código de um loop de polling do que para fazer a infra-estrutura para retornos de chamada.

Então, você obtém o código mais simples que se ele sair para ser um gargalo mais tarde pode ser facilmente compreendido e redesenhado / reformulado em outra coisa.

Isto não está respondendo a sua pergunta. Mas, realisticamente, especialmente neste "dia e idade", onde ciclos de processador são baratos, e largura de banda é grande, polling é realmente uma solução muito boa para algumas tarefas.

Os benefícios são:

  • Barata
  • confiável
  • Testable
  • flexível

Como em tudo, isso depende. Um grande de alta transação do sistema Eu trabalho sobre atualmente usa uma notificação com SQL (A DLL carregado dentro do SQL Server que é chamado por um SP prolongado de gatilhos em determinadas tabelas. O DLL notifica outros aplicativos que há trabalho a fazer).

No entanto, estamos afastando-se isso porque posso praticamente garantir que não haverá trabalho a fazer continuamente. Portanto, a fim de reduzir a complexidade e realmente acelerar as coisas um pouco, as aplicações irá processar o seu trabalho e imediatamente consultar o DB novamente para o novo trabalho. Caso haja nenhum ele vai tentar novamente após um pequeno intervalo.

Isso parece funcionar mais rápido e é muito mais simples. No entanto, outra parte da aplicação que é muito menor volume não beneficia de um aumento de velocidade utilizando este método - a menos que o intervalo de pesquisa é muito pequena, o que leva a problemas de desempenho. Então, nós estamos deixando-o como é para esta parte. Portanto, é uma coisa boa quando é apropriado, mas as necessidades de todos são diferentes.

Aqui está um bom resumo dos méritos relativos de empurrar e puxar: https://stpeter.im /index.php/2007/12/14/push-and-pull-in-application-architectures/

Eu gostaria de poder resumi-lo ainda mais para esta resposta, mas algumas coisas são melhor deixar integral.

Quando pensar em votação SQL, de volta ao dia de VB6 você costumava ser capaz de criar conjuntos de registros usando a palavra-chave WithEvents que era uma encarnação precoce de assíncrono "escuta".

Eu, pessoalmente, sempre procurar uma maneira de usar um eventos dirigidos implementação antes da votação. Se isso falhar uma implementação manual de nenhum dos seguintes ajuda poder:

  • serviço sql classe corretor / dependência
  • Algum tipo de tecnologia de fila (RabbitMQ ou similar)
  • UDP transmitir - técnica interessante que pode ser construído com vários ouvintes nó. Nem sempre é possível em algumas obras líquidos embora.

Algumas delas podem exigir uma ligeira reformulação do seu projeto, mas em um mundo corporativo pode ser a melhor rota para ir ao invés de um serviço de consulta.

agréée com a maioria das respostas que Async / Messaging é geralmente melhor. Estou absolutamente de acordo com a resposta de Robert Gould. Mas eu gostaria de acrescentar mais um ponto.

Um disso é que polling pode matar dois pássaros com uma pedra. Em um caso de uso particular, um projeto que eu estava envolvido com utilizada uma fila de mensagens entre bancos de dados, mas polling a partir de um servidor de aplicativos a um dos bancos de dados. Como a rede de servidor de aplicações para DB foi ocasionalmente para baixo, polling foi adicionalmente utilizado para notificar o aplicativo de problemas de rede.

No final, uso o que faz mais sentido para o caso de uso com escala capacidade em mente.

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