【发布时间】: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