Question

J'ai récemment entendu quelques développeurs dire qu'ils interrogeaient simplement des éléments (bases de données, fichiers, etc.) pour déterminer si quelque chose avait changé et qu'ils exécutaient ensuite une tâche, telle qu'une importation.

Je suis vraiment contre cette idée et pense que l’utilisation des technologies disponibles telles que la Remoting , WCF , etc., serait bien mieux que de procéder à une interrogation.

Cependant, j'aimerais identifier les raisons pour lesquelles d'autres personnes préfèrent une approche à une autre et, plus important encore, comment puis-je convaincre les autres que les sondages sont erronés à notre époque?

Était-ce utile?

La solution

L’enquête n’est pas "incorrecte". en tant que tel.

Cela dépend beaucoup de la manière dont elle est mise en œuvre et dans quel but. Si vous vous souciez vraiment de la notification immédiate d'un changement, c'est très efficace. Votre code se trouve dans une boucle étroite, interrogeant constamment (demandant) une ressource pour savoir si elle a été modifiée / mise à jour. Cela signifie que vous êtes informé dès que vous pouvez être que quelque chose est différent. Mais votre code ne fait rien d’autre et il ya beaucoup d’appels pour l’objet en question.

Si vous êtes moins préoccupé par la notification immédiate, vous pouvez augmenter l'intervalle entre les scrutations, mais cela peut également bien fonctionner, mais choisir l'intervalle correct peut s'avérer difficile. Trop long et vous risquez de manquer des modifications critiques, trop court et vous êtes de retour aux problèmes de la première méthode.

Des alternatives, telles que des interruptions ou des messages, etc., peuvent offrir un meilleur compromis dans ces situations. Vous êtes averti d'un changement dès que cela est pratiquement possible, mais ce retard n'est pas quelque chose que vous contrôlez, cela dépend du fait que le composant lui-même soit en temps opportun pour transmettre les changements d'état.

Qu'est-ce qui est "faux"? avec polling?

  • Cela peut être un monopole des ressources.
  • Cela peut être limitant (surtout si vous souhaitez en savoir plus sur / poll).
  • Cela peut être exagéré.

Mais ...

  • Ce n'est pas intrinsèquement faux.
  • Cela peut être très efficace.
  • C'est très simple.

Autres conseils

Il y a deux raisons pour lesquelles les sondages peuvent être considérés comme mauvais par principe.

  1. C'est un gaspillage de ressources. Il est très probable que vous recherchiez un changement alors qu'aucun changement ne s'est produit. Les cycles de processeur / la bande passante dépensés pour cette action n'entraînent pas de changement et auraient donc pu être utilisés pour autre chose.

  2. La scrutation est effectuée à un certain intervalle. Cela signifie que vous ne saurez pas qu’un changement est survenu jusqu’à ce que l’intervalle se soit écoulé.

Il serait préférable d’être informé des modifications. Ainsi, vous ne rechercherez pas les modifications qui ne se sont pas produites et vous saurez dès que la notification vous parviendra.

Exemples d'éléments utilisant les sondages de nos jours:

  • Les clients de messagerie interrogent les nouveaux messages (même avec IMAP).
  • Les lecteurs RSS interrogent les modifications de flux.
  • Les moteurs de recherche interrogent les modifications apportées aux pages qu'ils indexent.
  • Les utilisateurs de StackOverflow interrogent pour obtenir de nouvelles questions, en cliquant sur "actualiser"; -)
  • Les clients de Bittorrent interrogent le traqueur (et l'autre, je pense, avec DHT) pour connaître les changements survenus dans l'essaim.
  • Les verrous spin-lock sur des systèmes multicœurs peuvent constituer la synchronisation la plus efficace entre les cœurs, dans les cas où le délai est trop court pour avoir le temps de planifier un autre thread sur ce cœur, avant que l'autre cœur ne fasse ce que nous attendons. .

Parfois, il n’existe tout simplement aucun moyen d’obtenir des notifications asynchrones: par exemple, pour remplacer RSS par un système Push, le serveur doit connaître toutes les personnes qui lisent le flux et savent comment les contacter. Ceci est une liste de diffusion - une des choses que RSS a été conçue pour éviter. D'où le fait que la plupart de mes exemples sont des applications réseau, où cela risque d'être un problème.

D'autres fois, l'interrogation est suffisamment peu coûteuse pour fonctionner même en cas de notification async.

Pour un fichier local, la notification des modifications est probablement la meilleure option en principe. Par exemple, vous pourriez (empêcher) d'empêcher le disque de tomber en panne si vous le piquez à tout jamais, bien que le système d'exploitation puisse à nouveau mettre en cache. Et si vous interrogez toutes les secondes un fichier qui ne change que toutes les heures, vous pourriez occuper inutilement 0,001% (ou peu importe) de la puissance de traitement de votre machine. Cela semble minuscule, mais que se passe-t-il quand il faut 100 000 fichiers à interroger?

Cependant, dans la pratique, les frais généraux seront probablement négligeables, ce qui vous empêchera d’être enthousiasmé par le changement de code qui fonctionne actuellement. La meilleure chose à faire est de surveiller les problèmes spécifiques que les interrogations provoquent sur le système que vous souhaitez modifier - si vous en trouvez, soulevez-les plutôt que d'essayer de formuler un argument général contre toutes les interrogations. Si vous n'en trouvez pas, vous ne pouvez pas réparer ce qui n'est pas cassé ...

Il est facile de faire un sondage, très facile, c’est aussi simple que n’importe quel code de procédure. Ne pas interroger signifie que vous entrez dans le monde de la programmation asynchrone, qui n'est pas aussi cérébrale et qui peut même parfois devenir difficile.

Et comme dans tout système, le chemin de moindre résistance est normalement plus commun, donc il y aura toujours des programmeurs qui utilisent la scrutation, même les plus grands, car il n’est parfois pas nécessaire de compliquer les choses avec des modèles asynchrones.

Pour ma part, je cherche toujours à éviter les interrogations, mais quelquefois, je le fais quand même, en particulier lorsque les gains réels liés à la gestion asynchrone ne sont pas si importants, comme lorsque vous utilisez certaines petites données locales (bien sûr, vous obtenez un peu plus rapide , mais les utilisateurs ne remarqueront pas la différence dans un cas comme celui-ci). Il y a donc de la place pour les deux méthodologies à mon humble avis.

La scrutation des clients ne s’étend pas aussi bien que les notifications du serveur. Imaginez des milliers de clients demandant au serveur "de nouvelles données?" toutes les 5 secondes. Imaginez maintenant que le serveur garde une liste de clients pour notifier les nouvelles données. La notification du serveur évolue mieux.

Je pense que les gens devraient se rendre compte que dans la plupart des cas, à un certain niveau, des sondages sont effectués, même dans des situations entraînées par des événements ou des interruptions, mais que vous êtes isolé du code lui-même. Vraiment, c’est la situation la plus souhaitable… isolez-vous de la mise en œuvre et traitez-vous de l’événement. Même si vous devez implémenter l'interrogation vous-même, écrivez le code de manière à ce qu'il soit isolé et que les résultats soient traités indépendamment de l'implémentation.

Son simple - les scrutations sont mauvaises - inefficace, gaspillage de ressources, etc. Il existe toujours une forme de connectivité permettant de surveiller un événement quelconque, même si la "scrutation" n’est pas choisie.

Alors pourquoi faire un effort supplémentaire et mettre en place des sondages supplémentaires.

Les rappels sont la meilleure option - il suffit de vous inquiéter de lier le rappel à votre processus actuel. Des sondages sont en cours pour vérifier que la connexion est toujours en place de toute façon.

Si vous continuez à téléphoner / sonner à votre petite amie et qu'elle ne répond jamais, pourquoi continuer à appeler? Laissez simplement un message et attendez qu'elle «rappelle»;)

J'utilise occasionnellement des interrogations dans certaines situations (par exemple, dans un jeu, j'interroge l'état du clavier à chaque image), mais jamais dans une boucle qui effectue l'interrogation UNIQUEMENT. Si oui, faites quelque chose, sinon traitez quelque chose d’autre et revérifiez plus tard). De manière générale, j’évite les sondages en faveur des notifications asynchrones.

La raison en est que je ne dépense pas de ressources (temps processeur, peu importe) en attente de quelque chose (surtout si ces ressources pourraient accélérer ce qui se passe en premier lieu). Dans les cas où j'utilise un sondage, je ne reste pas inactif, j'utilise les ressources ailleurs, c'est donc un problème (pour moi, du moins).

Si vous recherchez des modifications dans un fichier, je conviens que vous devez utiliser les notifications du système de fichiers disponibles lorsque cela se produit, disponibles dans la plupart des systèmes d'exploitation maintenant.

Dans une base de données, vous pouvez déclencher la mise à jour / insérer, puis appeler votre code externe pour faire quelque chose. Cependant, il se peut que vous n'ayez pas besoin d'actions instantanées. Par exemple, vous aurez peut-être besoin d'obtenir des données de la base de données A vers la base de données B sur un autre réseau en moins de 15 minutes. La base de données B n’est peut-être pas accessible à partir de la base de données A, vous devez donc effectuer la scrutation à partir de, ou en tant que programme autonome s’appuyant sur la base de données B.

De plus, l’interrogation est une chose très simple à programmer. Il s’agit souvent d’une première étape de mise en œuvre lorsque les contraintes de temps sont courtes et que cela fonctionne suffisamment bien.

Le problème avec les sondages est que cela fonctionne! Son fiable et simple à mettre en œuvre.

Les coûts de la mise en commun peuvent être élevés - si vous analysez une base de données toutes les minutes, chaque fois que vous ne modifiez que deux modifications par jour, vous consommez beaucoup de ressources pour un très petit résultat.

Cependant, le problème de toute technologie de notification est qu’elles sont beaucoup plus complexes à mettre en œuvre et peuvent non seulement être peu fiables mais (et c’est un gros MAIS), vous ne pouvez pas dire facilement quand elles ne fonctionnent pas.

Donc, si vous abandonnez l'interrogation pour une autre technologie, assurez-vous qu'elle est utilisable par les programmeurs moyens et qu'elle est ultra fiable.

Je vois beaucoup de réponses ici, mais je pense que la réponse la plus simple est la réponse elle-même:

Parce qu'il est (généralement) beaucoup plus simple de coder une boucle d'interrogation que de créer l'infrastructure pour les rappels.

Ensuite, vous obtenez un code plus simple qui, s’il s'avère qu’il s’agit d’un goulot d’étranglement plus tard, peut être facilement compris et reconçu / reformaté pour en faire autre chose.

Cela ne répond pas à votre question. Mais de manière réaliste, en particulier en ce "jour et l’âge" Lorsque les cycles de processeur sont peu coûteux et que la bande passante est importante, l'interrogation est en fait une très bonne solution pour certaines tâches.

Les avantages sont les suivants:

  • pas cher
  • fiable
  • Testable
  • Flexible

Je conviens qu'éviter de voter est une bonne politique. Cependant, en ce qui concerne la message de Robert , je dirais que la simplicité du sondage peut en faire une meilleure approche dans les cas où les problèmes mentionnés ici ne sont pas un si gros problème, car l’approche asynchrone est souvent considérablement moins lisible et plus difficile à maintenir, sans parler des bugs qui peuvent s’insérer dans sa mise en œuvre.

Comme pour tout, ça dépend. Un grand système de transaction élevée sur lequel je travaille utilise actuellement une notification avec SQL (une DLL chargée dans SQL Server appelée par un SP étendu à partir de déclencheurs sur certaines tables. La DLL notifie ensuite aux autres applications qu'il reste du travail à faire).

Cependant, nous nous éloignons de cela car nous pouvons pratiquement garantir qu'il y aura du travail à faire en permanence. Par conséquent, afin de réduire la complexité et d’accélérer un peu les choses, les applications traitent leur travail et interrogent immédiatement la base de données à nouveau. S'il n'y en a pas, il essaiera de nouveau après un petit intervalle.

Cela semble fonctionner plus rapidement et est beaucoup plus simple. Toutefois, une autre partie de l’application, qui est un volume beaucoup plus faible, ne bénéficie pas d’une augmentation de la vitesse avec cette méthode - à moins que l’intervalle d’interrogation soit très petit, ce qui entraîne des problèmes de performances. Nous laissons donc tel quel pour cette partie. C'est donc une bonne chose quand c'est approprié, mais les besoins de chacun sont différents.

Voici un bon résumé des mérites relatifs du push and pull:   https://stpeter.im /index.php/2007/12/14/push-and-pull-in-application-architectures/

Je souhaiterais pouvoir résumer cela plus avant dans cette réponse, mais il vaut mieux laisser certaines choses sans texte.

Lorsque vous réfléchissiez à l'interrogation SQL, à l'époque de VB6, vous pouviez créer des jeux d'enregistrements à l'aide du mot clé WithEvents, qui était une incarnation précoce de "l'écoute" asynchrone.

Personnellement, je rechercherais toujours un moyen d’utiliser une implémentation basée sur les événements avant la scrutation. À défaut, une implémentation manuelle de l’un des éléments suivants pourrait être utile:

  • courtier de services SQL / classe de dépendance
  • Un type de technologie de file d'attente (RabbitMQ ou similaire)
  • diffusion UDP - technique intéressante qui peut être construit avec plusieurs écouteurs de nœud. Pas toujours possible sur certains réseaux, cependant.

Certaines d'entre elles peuvent nécessiter une légère modification de la conception de votre projet, mais dans un monde d'entreprise peut être la meilleure voie à suivre plutôt qu'un service de sondage.

Convenez avec la plupart des réponses qu'Async / Messaging est généralement préférable. Je suis tout à fait d'accord avec la réponse de Robert Gould. Mais j'aimerais ajouter un autre point.

Un ajout est que le vote peut tuer deux oiseaux avec une pierre. Dans un cas d'utilisation particulier, un projet auquel j'ai participé utilisait une file de messages entre des bases de données, mais interrogeait un serveur d'applications vers l'une des bases de données. Du fait que le réseau du serveur d'applications à la base de données était parfois hors service, la scrutation était également utilisée pour signaler à l'application des problèmes de réseau.

En fin de compte, utilisez ce qui a le plus de sens pour le cas d'utilisation en tenant compte de la possibilité de mise à l'échelle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top