2

我需要在不同的计算机上独立记录事件,并重建这些事件相对于彼此发生的顺序。该方案要求每台计算机相对独立;他们不能直接相互交谈或与单一来源交谈。

我最初的解决方案记录了每台机器上的时间,但是由于不同机器上的时间可能不同,并且可以全天变化,这并没有完全解决我的问题。我决定在机器 (1) 启动进程或 (2) 系统时钟发生变化时与所有机器共享。

所以从每台机器上我都会得到一个完整的日志

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

每当发生上述 (1) 或 (2) 时,我都会在日志中添加一个活动并将其广播到其他机器,这些机器将相同的活动添加到他们的日志中,其中 TranslatedTime 是他们自己的时间:

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>从每台机器中获取 a 并将其按顺序合并到一个列表中的最佳方法是什么?

4

6 回答 6

2

如果两台机器通过网络连接,您的程序可以询问另一台机器现在几点。这样,您在机器 A 上的程序可以询问 A 和 B 上的时间,然后记录两次。

您提到时间可能会在白天发生变化(大概是用户更改了时间)。您可以使用 Win32.TimeChanged 事件检测到这一点。

于 2009-05-06T00:05:40.430 回答
2

原子时间,以及将其提供给您的网络服务。这就是你需要的。实际的?不知道。但至少您不必担心试图同步时钟的 n 台计算机。

于 2009-05-06T00:11:30.213 回答
1

看起来他们希望你对分布式事务有直觉

另外,查看网络时间协议

NTP 是一种旨在通过网络同步计算机时钟的协议。

于 2009-05-06T00:03:24.773 回答
1

我认为您想以 UTC(通用时间)记录所有内容。这将允许记录时间及其相对于共同时间点的时间,并使比较日期/时间变得非常容易。要在本地时间显示它们,您只需识别偏移量并计算 UTC 时间与本地时间的差异。例如在东海岸它的UTC-5,所以如果UTC时间是17:00,纽约当地时间是12:00,达拉斯是UTC-6,所以它是上午11:00。

因此,如果您在达拉斯上午 11:10 有一个事件,其 UTC 时间是 17:10,而在纽约下午 12:05 有一个事件是 UTC 时间 17:05,那么您知道纽约事件首先发生,但是如果你原始比较了这似乎不是这样的时代。

UTC 的另一个优势是它始终代表一天中的所有 24 小时,因此在秋季,当您离开夏令时时,您不会收到 2 组凌晨 2 点至凌晨 3 点的事件,并且当您向前走时不会浪费时间进入日光节约时间。

于 2009-05-06T00:31:07.267 回答
0

首先:如果每台机器上的操作是真正并行的,你不能保证只有一个规范的序列化排序。如果整个过程中有一些协调,你最好在协议中使用某种排序,这样你就可以按它排序。

除此之外,您需要计算机器之间的时钟偏差以调整时间。你这样做的方法相当简单:询问另一台机器的当前时间,并测量该请求的往返时间。假设远程机器报告的时间在往返时间的一半前是正确的(这假设平均延迟是对称的——并不总是正确的,但如果不深入研究网络布局,你就不能做得更好),然后减去它从当前机器的时间开始。那是你的时钟偏差。您可能需要多次测量偏差并取平均值,以消除连接上的间歇性延迟。

于 2009-05-06T00:29:30.513 回答
0

如果您需要计算机之间非常准确的时钟同步,请使用 GPS。

于 2010-12-16T08:34:52.553 回答