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

我的初始解决方案记录了每台机器上的时间,但由于不同机器上的时间可能不同,并且可能在一天内发生变化,这并不能完全解决我的问题。每当机器(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上的程序可以在A和B上询问时间,然后记录两次。

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

其他提示

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

看起来他们希望您直接了解分布式交易

另外,请查看网络时间协议

  

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

我认为您希望以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 am-3am事件,你不会失去你春天的时间前进到dalylight节省时间。

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

除此之外,您还需要计算机器之间的时钟偏差以调整时间。您这样做的方式相当简单:向另一台机器询问其当前时间,并测量该请求的往返时间。假设远程机器报告的时间在往返时间的一半时为真(假设平均对称延迟 - 并非总是如此,但如果不深入挖掘网络布局,则无法做得更好),并减去它来自当前机器的时间。那是你的时钟偏差。您可能需要多次测量偏斜并取平均值,以平衡连接上的间歇延迟。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top