2008-12-23 127 views
13

我正在研究将一个简单的同步功能写入我的应用程序,并且弹出的一个问题是两台远程计算机之间的时间同步,每台计算机都有自己的时钟(在特别是关于文件/对象的修改日期)。两台远程计算机之间的同步(时钟)

我敢肯定有很多的研究提供了关于这个话题已经完成,不想太理论化,但如果有任何公认的最佳实践,最大限度地减少远程时钟之间的时间差异我想知道?

例如,一开始是始终使用通用时间(UTC)为避免时区的问题,但不能保证两台计算机将具有完全相同的系统时间。幸运的是,我所做的工作并不是非常细致,所以这不是一个非常重要的问题,但我仍然很好奇。

一个解决方案是始终在两端使用相同的时钟,例如全局时间服务器,而不是本地系统时钟。据推测(与共享资源锁相结合)可以保证同步时间不会意外重叠,但这不是很实际。只是突然出现在我的脑海

想到会是每个节点(每个客户端)与之前,或许通过计算系统时钟与全球时间服务器的偏移量的偏移量在某个时刻计算同步。这只需要偶尔进行,因为抵消本身不可能在短时间内发生很大变化。

更新:我只是补充一点,我并不感兴趣实际上同步两台计算机的系统时钟 - 我认为操作系统将在大多数情况下处理这种情况。这只是一个如何确保应用程序的两个实例使用同步时间的问题,不过在现在这个时代,我认为系统时钟几乎可以确实同步到一些非常小的三角洲内。

回答

18

像其他人所推荐的那样,依靠NTP为您的应用程序提供便捷的功能。正确的方法是使用Lamport的分布式时钟同步算法。这是在他的经典1978年论文Time, clocks, and the ordering of events in a distributed system解释。

+1

我抬头看了Lamport的论文,似乎在讨论时钟同步时被广泛引用。不幸的是,[看起来](http://www.amazon.com/Distributed-Systems-Principles-Paradigms-2nd/dp/0132392275)这个算法不适合实时应用程序(就像这里所讨论的那样)(http://stackoverflow.com/questions/12760388/how-to-set-a-variable-that-represents-a- time-in-the-future-in-absolute-terms-obj))..关于非NTP依赖性的实时时钟同步算法的任何提示? – abbood 2012-10-08 14:19:37

3

将它们与NTP网络时间协议同步。

你在哪个平台上?

使用NTP,您可以将计算机的时间与原子钟同步并使用世界的官方时间。

+0

.NET,但它是比什么理论问题。 – devios1 2008-12-23 17:00:28

3

而不是编写代码来同步时钟,是不是可以在两台机器上运行一个ntp客户端?

或者,如果上述操作不可行并且您的应用程序运行时具有足够的权限来设置时间,我会试图在应用程序中实现最小的NTP客户端,并尝试将其与公共服务器进行同步。只是不要硬编码某人的私人服务器...

+0

我并不热衷于改变用户的系统时钟。 – devios1 2008-12-23 17:01:52

0

任何联网的机器应该使用NTP。所有现代系统都包括一个简单的方法来设置这个。唯一的问题应该是选择一个特定的服务器,如果你需要一点额外的精度;但它已经在毫秒范围内,所以我不在乎,通常只是指向pool.ntp.org内

2

一两件事,我们基本上是卸载所有定时操作的“主机”的机器。例如,如果您有20个共享数据库的服务器,请使用数据库的时间。如果你有一台中央服务器和一百万台客户机,那么客户机不应该对任何计时负责;做所有的同步服务器端。在一个真正的“分布式”环境中,如P2P网络或类似的东西,可以使用最直接“拥有”相关资源的机器(即您想要写入的实际PC)来同步/控制对文件的访问。

+0

这些都是很好的建议,更多的是我正在寻找的答案。但是,假设两台计算机都没有资源并且它是真正共享的。此外,两台计算机都无法直接访问其他计算机,因此无法使用其时钟。 – devios1 2008-12-23 17:27:44

3

这是一个问题,我现在必须解决一些不熟练的最终用户,他们可以做很多事情来破坏以前贡献者提出的合理建议。一个单纯的最终用户可以做至少这些事情,更多:

1)没有足够的计算知识,能够建立NTP时间同步

2)自己的计算机时钟设置为房子时钟或手机时钟是不正确

3)在Windows XP中意外禁用NTP时间同步和不知道如何重新启用它,或者在其计算机日期为错误,在这种情况下的Windows NTP不工作

4)电脑bios电池已经平了,所以pc始终在1970年启动!

5)用户将笔记本电脑带到国外并暂时将笔记本电脑时钟设置为当地时间,但不更改时区,因此现在电脑将返回错误的utc时间!

所以你的程序本身将不得不管理时间,当然你想用最小的开销来做到这一点。

让我们假设两个运行您的程序的最终用户需要程序在未来的相同绝对时间执行某些操作。

我提出这个方案,它从cron作业的方式中获得一些想法,如果任何人都可以提出改进意见,我会很高兴。 1)当你的应用程序启动时,它通过肥皂呼叫到第三方服务器或你自己的时间服务器(你可以用ntp自己保持时间)来同步它自己的内部utc时间到ntp。

2)之后,它添加从系统时钟流逝的时间以保持时间。如果要求很严格,您可能需要每隔一段时间重复一次ntp同步。

3)然后,应用程序查看它需要按时完成的未来作业列表。它需要知道最早的工作。

4)然后创建一个线程,让它在最早的工作之前放置一段时间,而不是安全边界,这取决于您的要求可能提前10分钟,提前一到两个小时等等。

5)当线程唤醒时,它会通过进一步的肥皂调用重新检查绝对时间,然后依靠系统时间时钟添加经过的时间,直到达到第一个工作应执行的时间出。

6)只要作业被触发(在另一个线程中运行),时间监视线程就会计算下一个任务时间,并在此期间再次进入睡眠状态。

增强的想法:

1)用户可以在到期作业之前关闭您的应用程序,所以你可能需要一个后台进程或服务,它使用上述同样的同步方案,以独立地监控你的工作列表,存储在数据库或文件中,并及时启动应用程序。 (在Windows中,生成应用程序进程)

2)您的应用程序可能正在添加更新的,更早的作业或正在删除作业,因此您的睡眠线程可能需要被唤醒才能重新计算新的早期作业,或在删除作业之后的作业。在Win32中,你可以通过你的线程在一个事件上等待超时来做到这一点,你设置它强制它重新计算睡眠时间。在Linux中毫无疑问存在类似的机制。

3)对于SOAP调用,以获得时间保持一个音符时发送的SOAP和接收到响应的时候。如果周转时间过长,您不能依赖时间,可能需要重复呼叫,否则您可能会妥协。例如,如果肥皂表示计算机时钟快5分钟,但Soap调用本身需要一分钟才能回复,那么您只能确定计算机时钟至少快4分钟。

0

请勿使用NTP。 NTP仅用于获取日期/时间。

它的工作原理,以便同步不沟通的应用程序之间的事件。例如,一个闹钟应用程序和你的身体。

对于具有直接通信的应用程序,共享资源,使用兰波特时钟或矢量时钟作为季奥米季斯说。 Lamport时钟非常适合实现事件之间的偏序,当需要识别并发事件时,向量时钟非常好。

相关问题