【问题标题】:How to record relative times between computers?如何记录计算机之间的相对时间?
【发布时间】:2009-05-05 23:58:37
【问题描述】:

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

我最初的解决方案记录了每台机器上的时间,但是由于不同机器上的时间可能不同,并且可以全天变化,这并没有完全解决我的问题。我决定在机器 (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> 并将其按顺序合并到一个列表中的最佳方法是什么?

【问题讨论】:

  • 你不能让所有的服务器用一个共同的来源同步他们的时钟吗?或者,通过让每台机器将其日志写入单个数据库并使用数据库时钟来同步事件?您的解决方案似乎过于复杂。
  • 是的,不是吗?我处于一个无法添加到现有基础设施的环境中。这是我的解决方案中的一个限制,而不是我想要的方式。
  • 为什么您的系统时钟会被修改? :s 时间一次只改变一秒。都是相对的! + karims 的回答应该会引导你朝着好的方向发展

标签: c# time computer-science


【解决方案1】:

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

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

【讨论】:

  • 是的,上面的问题陈述包括时间变化和机器相互交谈。我正在努力解决“以正确的顺序将所有内容合并在一起”部分。
  • 选择一台计算机 A B,并始终记录该计算机的时间。
  • 如果计算机永远不会回到过去,那就可以了。请参见上面的示例。 “收到答案”活动需要“提出问题”之后进行,即使在它自己的机器上它在标记的时间之前是在它之前。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    看起来他们想让你对distributed transactions有直觉

    另外,请查看Network Time Protocol

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

    【讨论】:

      【解决方案4】:

      我认为您想以 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 点的事件,你不会在春天失去时间前进到日光节约时间。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-07-13
            • 1970-01-01
            • 2023-04-09
            • 2017-01-08
            • 2021-03-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多