質問

イベントを別のコンピューターに個別に記録し、それらのイベントが相互に関連して発生した順序を再構成する必要があります。このソリューションでは、各コンピューターが比較的独立している必要があります。互いに直接話すことも、単一のソースと話すこともできません。

最初のソリューションでは各マシンの時間を記録しましたが、時間はマシンによって異なり、1日を通して変わる可能性があるため、これは私の問題を完全には解決しませんでした。マシンが(1)プロセスを開始するか、(2)システムクロックが変更されるたびに、すべてのマシンと共有することにしました。

したがって、各マシンからこれらのログがいっぱいになります

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

上記の(1)または(2)が発生するたびに、ログにアクティビティを追加し、他のマシンにブロードキャストします。他のマシンは、同じアクティビティをログに追加します。

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

したがって、マシンAには(順番に)次のようになります。

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.

そしてマシンBには(順番に)次のようになります:

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

したがって、これらのイベントの順序とタイミングを次のように再構成する必要があります。

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

各マシンからList<Activity>を取得し、順番にイベントを含む1つのリストにマージする最良の方法は何ですか?

役に立ちましたか?

解決

2つのマシンがネットワークを介して接続されている場合、プログラムは他のマシンに何時かを尋ねることができます。そうすれば、マシンAのプログラムはAとBの両方の時間を要求し、両方の時間を記録できます。

時間は日中に変更される可能性があると言います(おそらくユーザーが時間を変更したと思われます)。これは、Win32.TimeChangedイベントを使用して検出できます。

他のヒント

アトミックタイム、およびそれを提供するWebサービス。それはあなたが必要とするものです。現実的?わからない。ただし、少なくともn台のコンピューターが時計を同期しようとすることを心配する必要はありません。

分散トランザクション

に向けて直観してほしいようです。

また、ネットワークタイムプロトコルをチェックしてください:

  

NTPは、   コンピューターの時計を同期する   ネットワーク経由で。

すべてをUTC(世界時)で記録したいと思います。これにより、時刻を共通の時点を基準にした時刻で記録でき、日付/時刻の比較が非常に簡単になります。現地時間で表示するには、オフセットを特定し、UTC時間から現地時間までの差を計算します。例えば東海岸ではUTC -5であるため、UTC時間が17:00の場合、ニューヨークの現地時間は12:00であり、ダラスではUTC-6であるため、午前11:00です。

ダラスで午前11時10分にイベントがあり、UTC時間は17時10分であり、ニューヨークの午後12時5分にイベントが17時5分UTCである場合、ニューヨークイベントが最初に発生したことがわかります。 、しかし、あなたが生の時間を比較した場合、これはそうではないようです。

UTCには、1日の24時間すべてを常に表すという利点もあります。そのため、秋に夏時間をオフにすると、午前2時から午前3時のイベントを2セット取得できず、春に時間を失うことはありませんdalylightの節約時間に進みましょう。

最初に:各マシンでの操作が完全に並列である場合、単一の正規シリアル化順序があることを保証できません。プロセス全体に何らかの調整がある場合は、プロトコルで何らかの種類のシーケンスを使用することをお勧めします。そうすることで、ソートすることができます。

それとは別に、時間を調整するためにマシン間のクロックスキューを計算する必要があります。その方法は比較的簡単です。他のマシンに現在の時間を尋ね、そのリクエストの往復時間を測定します。リモートマシンによって報告された時間が前の往復時間の半分で真であったと仮定します(これは平均で対称的な遅延を想定しています-常に真であるとは限りませんが、ネットワークレイアウトを深く掘り下げなければ本当に良いことはできません)現在のマシンの時間から。それがクロックスキューです。接続の断続的な遅延を均等にするために、スキューを数回測定し、平均を取ることができます。

コンピューター間で非常に正確なクロック同期が必要な場合は、GPSを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top