Question

Je cherche à rédiger une simple capacité de synchronisation dans mon application et l'une des préoccupations qui a surgi consiste à synchroniser le temps entre deux ordinateurs distants, chacun avec leur propre horloge (en particulier concernant les dates de modification des fichiers / objets).

Je suis sûr que beaucoup de recherches ont été effectuées sur ce sujet et je ne veux pas devenir trop théorique, mais je me demande s'il y a des meilleures pratiques acceptées pour minimiser les écarts temporels entre les horloges distantes?

Par exemple, un début consiste à toujours utiliser le temps universel (UTC) car cela évite les problèmes de fuseau horaire, mais rien ne garantit que deux ordinateurs auront exactement le même temps système. Heureusement, le travail que je fais n'est pas très fin, donc ce n'est pas une préoccupation terriblement importante, mais je suis quand même curieux.

Une solution consisterait à toujours utiliser la même horloge aux deux extrémités, comme un serveur de temps mondial, plutôt que l'horloge système locale. Vraisemblablement, cela (combiné avec des serrures de ressources partagés) ne pourrait garantir aucun chevauchement accidentel du temps synchronisé, mais ce n'est pas très pratique.

On pensait que je viens de me sauter dans la tête serait de synchroniser chaque nœud (chaque client) avec un décalage calculé à un moment donné auparavant, peut-être en calculant le décalage de l'horloge système avec un serveur temporel global. Cela ne devrait être fait que de temps en temps car le décalage lui-même ne changerait probablement pas beaucoup sur une courte période.

Mise à jour: Permettez-moi d'ajouter que je ne suis pas intéressé à synchroniser les horloges système de deux ordinateurs - je suppose que le système d'exploitation gère cela dans la plupart des cas. Il s'agit simplement de savoir comment s'assurer que deux instances d'une application utilisent des temps synchronisés, bien que de nos jours, je suppose que les horloges système seraient presque assurément synchronisées dans un très petit delta de toute façon.

Était-ce utile?

La solution

Le fait de compter sur NTP pour votre application comme d'autres l'ont recommandé est le fudge facile. L'approche correcte consiste à utiliser l'algorithme de synchronisation d'horloge distribué de Lamport. Il est expliqué dans son article classique de 1978 Temps, horloges et commande d'événements dans un système distribué.

Autres conseils

Regarder "Protocole de temps de réseau"(NTP) Spécification.

Vous pouvez essayer PTP, le protocole de précision de précision (PTP) est un protocole utilisé pour synchroniser les horloges à travers un réseau informatique. Sur un réseau local, il atteint la précision de l'horloge dans la gamme sous-microsconde, ce qui le rend adapté aux systèmes de mesure et de contrôle.http://en.wikipedia.org/wiki/precision_time_protocol

Au lieu d'écrire du code pour synchroniser les horloges, ne serait-il pas possible d'exécuter un client NTP sur les deux machines?

Alternativement, si ce qui précède n'est pas possible et que votre application fonctionne avec des privilèges suffisants pour définir l'heure, je serais tenté d'implémenter un client NTP minimal dans l'application et d'essayer de le synchroniser contre un serveur public. Ne coquez pas le serveur privé de quelqu'un dans ...

Les synchroniser avec NTP Protocole de temps de réseau.

Sur quelle plate-forme êtes-vous?

Avec NTP, vous pouvez synchroniser l'heure de vos ordinateurs avec des horloges atomiques et utiliser l'heure officielle du monde.

C'est un problème que je dois actuellement résoudre en ce qui concerne les utilisateurs finaux non sophistiqués qui peuvent faire beaucoup de choses pour bouleverser les suggestions sensées faites par les contributeurs précédents. Un utilisateur final non sophistiqué peut faire au moins ces choses, et plus encore:

1) Ne pas avoir suffisamment de connaissances informatiques pour pouvoir configurer la synchronisation du temps NTP

2) Réglez leur horloge de temps d'ordinateur sur une horloge de maison ou une horloge de téléphone portable incorrect

3) Dans Windows XP, désactiver accidentellement la synchronisation du temps NTP et ne pas savoir comment l'activer à nouveau, ou faire définir leur date d'ordinateur, auquel cas Windows NTP ne fonctionne pas

4) La batterie du BIOS informatique est devenue à plat, donc le PC démarre toujours en 1970!

5) L'utilisateur prend son ordinateur portable à l'étranger et définit temporairement l'horloge d'ordinateur portable à l'heure locale mais ne change pas le fuseau horaire, alors maintenant le PC retournera un temps UTC incorrect !!!

Donc, votre programme lui-même devra gérer le temps, et bien sûr, vous voulez le faire avec un minimum de frais généraux.

Supposons que deux utilisateurs finaux exécutant vos programmes ont besoin des programmes pour faire quelque chose au même moment absolu à l'avenir.

Je propose ce schéma, qui prend quelques idées de la façon dont Cron Jobs fonctionne, je serais heureux que quelqu'un puisse suggérer des améliorations à l'idée.

1) Lorsque votre application démarre, elle synchronise son propre temps UTC interne vers NTP via un appel de savon vers un serveur tiers ou sur votre propre serveur de temps (que vous pouvez vous-même garder à temps avec NTP).

2) Après cela, il ajoute du temps écoulé à partir de l'horloge système pour maintenir le temps. Si les exigences sont strictes, vous devrez peut-être répéter la synchronisation NTP à intervalles.

3) La demande examine ensuite une liste de futurs travaux qu'elle doit faire à temps. Il doit connaître le premier emploi.

4) Il crée ensuite un fil qu'il endorme pendant la durée avant le premier emploi, moins une marge de sécurité, qui selon vos besoins pourrait être 10 minutes à l'avance, une heure ou deux à l'avance, etc.

5) Lorsque le fil se réveille, il recouvre le temps absolu avec un autre appel de savon, puis s'appuie sur l'horloge du temps du système pour ajouter du temps écoulé jusqu'à ce qu'il atteigne le moment où le premier travail doit être effectué.

6) Dès que le travail est déclenché (exécutez-le dans un autre thread), le thread de surveillance temporelle calcule le temps de tâche à venir et s'endorme à nouveau pendant la durée.

Améliorations à l'idée:

1) Un utilisateur peut fermer votre application avant le travail d'échéance, vous pouvez donc avoir besoin d'un processus ou d'un service d'arrière-plan, qui utilise le même schéma de synchronisation ci-dessus, pour surveiller indépendamment vos listes d'emplois, stockées dans une base de données ou un fichier et démarrer le application dans le temps. (Dans Windows, engendrer le processus d'application)

2) Votre application peut ajouter des emplois plus récents et antérieurs à la volée ou supprimer des emplois, de sorte que votre fil de couchage devra probablement être éveillé pour recalculer pour le nouvel emploi antérieur, ou pour le travail après le travail supprimé. Dans Win32, vous le feriez par votre fil en attente avec un temps mort lors d'un événement, que vous avez décidé de le forcer à recalculer le temps de sommeil. Dans Linux, il existe sans aucun doute un mécanisme similaire.

3) Pour l'appel de savon pour obtenir le temps de garder une note du moment où le savon est envoyé et lorsque la réponse est reçue. Si le délai d'exécution est trop long, vous ne pouvez pas compter sur l'heure et peut avoir besoin de répéter l'appel, ou vous pouvez faire des compromis. Par exemple, si le savon indique que l'horloge informatique est de 5 minutes rapidement, mais que l'appel de savon lui-même a pris une minute pour répondre, vous pouvez seulement dire avec certitude que l'horloge informatique est rapide au moins 4 minutes.

Une chose que nous faisons est de décharger essentiellement toutes les opérations de synchronisation sur la machine «hôte». Par exemple, si vous avez 20 serveurs qui partagent tous une base de données, utilisez le temps de la base de données. Si vous avez un serveur central et un million de machines clients, les machines clients ne devraient pas être responsables de la synchronisation; Faites tout votre côté du serveur de synchronisation. Dans un environnement vraiment «distribué», comme un réseau P2P ou quelque chose, utilisez la machine qui possède le plus directement la ressource en question (le PC réel que le fichier que vous souhaitez écrire) pour synchroniser / contrôler l'accès au fichier.

Toute machine en réseau doit utiliser NTP. Tous les systèmes modernes incluent un moyen facile de configurer cela. Le seul problème devrait être de choisir un serveur spécifique, si vous avez besoin d'un peu de précision supplémentaire; Mais c'est déjà dans la gamme de millisecondes, donc je m'en fiche et je pointe généralement de pool.ntp.org

N'utilisez pas NTP. NTP est pour obtenir une date / heure uniquement.

Il fonctionne pour synchroniser les événements entre les applications qui ne communiquent pas. Une application d'alarme et votre corps, par exemple.

Pour les applications qui ont une communication directe, le partage d'une ressource, utilisez des horloges de lamport ou des horloges vectorielles comme l'a dit Diomidis. Les horloges Lamport fonctionnent très bien pour obtenir un ordre partiel entre les événements, les horloges vectorielles sont excellentes lorsque vous devez identifier les événements simultanés.

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