Question

Je dois enregistrer indépendamment des événements sur différents ordinateurs et reconstituer l'ordre dans lequel ces événements se sont produits les uns par rapport aux autres. La solution appelle chaque ordinateur à être relativement indépendant; ils ne peuvent pas se parler directement ni à une seule source.

Ma solution initiale enregistrait l'heure sur chaque machine, mais comme les heures peuvent être différentes sur différentes machines et peuvent changer tout au long de la journée, cela n'a pas complètement résolu mon problème. J'ai décidé de partager avec toutes les machines chaque fois qu'une machine (1) démarre le processus ou (2) modifie son horloge système.

Donc, à partir de chaque machine, je reçois un journal complet de ces

public class Activity {
    DateTime TimeOccurred { get; set; }
    string Description { get; set; }
}

Chaque fois que (1) ou (2) se produit ci-dessus, j'ajoute une activité au journal et la diffuse aux autres machines, qui ajoutent la même activité à leur journal, avec TranslatedTime correspondant à leur heure:

public class TimeSynchronization : Activity {
    string SourceMachine { get; set; }
    DateTime TranslatedTime { get; set; }
}

Donc, la machine A aurait (dans l'ordre):

TimeSynchronization "started" at 3:00 am.
Activity "asked a question" at 3:05 am.
TimeSynchronization from machine B at 3:05 am.
TimeSynchronization "clock changed" at 3:03 am.
Activity "received an answer" at 3:04 am.

Et la machine B aurait (dans l'ordre):

TimeSynchronization "started" at 3:05 am.
TimeSynchronization "clock changed" at 3:06

Il me faut donc reconstituer le même ordre et le même timing que ces événements ci-dessus, à un niveau tel que:

On machine A: TimeSynchronization "started" at 0:00
On machine A: Activity "asked a question" at 0:05
On machine B: TimeSynchronization "started" at 0:05
On machine A: TimeSychronization from machine B at 0:05
On machine A: TimeSynchronization "clock changed" at 0:06
On machine B: TimeSynchronization "clock changed" at 0:06
On machine A: Activity "received an answer" at 0:07

Quel est le meilleur moyen de prendre un List<Activity> de chaque ordinateur et de le fusionner en une seule liste avec les événements dans l'ordre?

Était-ce utile?

La solution

Si les deux machines sont connectées via le réseau, votre programme peut demander à l’autre machine quelle heure il est. De cette façon, votre programme sur la machine A pourrait demander l’heure sur A et B, puis enregistrer les deux fois.

Vous dites que l'heure pourrait changer pendant la journée (vraisemblablement, l'utilisateur a changé l'heure). Vous pouvez le détecter en utilisant l'événement Win32.TimeChanged.

Autres conseils

Le temps atomique et un service Web qui vous le donnerait. C'est ce dont tu as besoin. Réaliste? Aucune idée. Mais au moins, vous n’auriez pas à vous soucier des n ordinateurs qui essaient de synchroniser leurs horloges.

On dirait qu'ils veulent que vous intuitiez vers les transactions distribuées

.

Consultez également le protocole de temps réseau :

.
  

NTP est un protocole conçu pour   synchroniser les horloges des ordinateurs   sur un réseau.

Je pense que vous voulez tout enregistrer en UTC (temps universel). Ceci permettra aux heures d'être enregistrées avec leurs heures par rapport à un point commun dans le temps et rend la comparaison des dates / heures très facile. pour les afficher en heure locale, il vous suffit d'identifier le décalage et de calculer la différence entre l'heure UTC et l'heure locale. par exemple. sur la côte est son UTC -5, si l'heure UTC est 17h00, l'heure locale à New York est 12h00 et à Dallas son UTC-6, donc il est 11h00.

donc si vous avez un événement à 11h10 à Dallas, il est 17h10 et un événement à New York à 12h05 est 17h05 UTC, vous savez que l'événement de New York s'est produit en premier , mais si vous avez comparé les temps, cela ne semble pas être le cas.

UTC a également l’avantage de toujours représenter toutes les 24 heures de la journée, de sorte qu’à l’automne, lorsque vous partez de l’économie de la lumière du jour, vous n’obtenez pas deux séries d’événements de 2h à 3h et vous ne perdez pas des heures au printemps. transmettre pour gagner du temps avec dalylight.

Tout d’abord: si les opérations sur chaque machine sont réellement parallèles, vous ne pouvez pas garantir qu’il existe un seul ordre sérialisé canonique. S'il y a une certaine coordination dans l'ensemble du processus, vous feriez mieux d'utiliser une sorte de séquence dans le protocole, afin que vous puissiez simplement trier par elle.

En dehors de cela, vous devez calculer le décalage d'horloge entre les machines afin de régler les temps. La façon dont vous le faites est relativement simple: demandez à l’autre machine l’heure actuelle et mesurez le temps aller-retour pour cette demande. Supposons que le temps rapporté par la machine distante était vrai il y a deux fois le temps aller-retour (cela suppose des retards symétriques en moyenne - pas toujours vrai, mais vous ne pouvez pas vraiment faire mieux sans creuser profondément dans la disposition du réseau), et soustrayez à partir de l'heure de la machine actuelle. C'est votre horloge asymétrique. Vous voudrez peut-être mesurer le biais plusieurs fois et prendre une moyenne afin d’égaliser le décalage intermittent sur la connexion.

Si vous avez besoin d'une synchronisation d'horloge très précise entre ordinateurs, utilisez le GPS.

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