Java是否有现成的时钟同步解决方案?

时间:2009-06-02 13:42:41

标签: java real-time distributed clock-synchronization vector-clock

我们有一个大型高性能软件系统,它由多个交互式Java进程(而不是EJB)组成。每个进程可以在同一台机器上,也可以在不同的机器上。

某些事件在一个进程中生成,然后以不同的方式传播到其他进程以进行进一步处理,等等。

为了进行基准测试,我们需要创建一个日志,记录每个事件何时通过“检查点”,最终将这些日志组合起来,以获得每个事件如何通过系统传播的时间线以及延迟(当然,进程切换)和IPC增加延迟,这是好的)。

问题当然是时钟同步。所以这是我的问题:

1)如果所有进程都在同一台机器上,是否保证currentTimeMilis在通话时是准确的? ITP的错误是否存在一些限制?

2)如果某些进程可能在不同的机器上,那么是否存在用于时钟同步的现成解决方案(也是免费或开源的)?我最好寻找可以绕过操作系统(Windows或Linux)并直接从Java工作的解决方案。我也非常理想地寻找能够以微秒精度运行的东西。我考虑过NTP,但我不确定它是否可以通过Java而不是通过操作系统获得,而且我不确定它的复杂程度。

3)有没有办法确定在特定配置(或我最终使用的任何解决方案)中使用NTP的误差范围,以便我可以在计算延迟时给出误差范围?

谢谢!

4 个答案:

答案 0 :(得分:4)

使用分布式编程,时钟同步通常是不够的。您可能想要构建一个逻辑时间框架(例如Lamport或矢量时钟或Singhal-Kshemkalyani方法......并且还有更多的负载来保持机器间同步的因果关系)。您选择的通常取决于应用程序和事件之间所需的因果关系。

时钟被同步以确保并发事件以正确的顺序保持。除了保持系统时钟同步之外,还有其他方法可以做到这一点......除非它们共享一个共同的物理时钟......非常棘手。

就NTP误差范围而言,有解决方案:

我的建议:

读: 分布式计算:原理,算法和系统

特别是:第3章,逻辑时间

修改

除了Cheeso的帖子,我找到了

http://www.uniforum.org/publications/ufm/apr96/opengroup.html

http://sourceforge.net/projects/freedce

那里可能有DCE Java绑定。

答案 1 :(得分:2)

我真的只是使用NTP。即使在互联网上它也非常准确,在局域网上应该更好。根据维基百科[1],

NTPv4通常可以在公共互联网上保持10毫秒(1/100秒)的时间,并且在理想条件下可以在局域网中实现200微秒(1/5000秒)或更高的精度。

因此,如果您的条件足够“理想”,那么它可能足以满足您的需求。 NTP已经存在很长时间了,几乎所有东西都适用它。我没有看到任何理由通过Java而不是操作系统来做到这一点。如果操作系统同步,那么Java也是如此。

[1] Wikipedia: Network Time Protocol

答案 2 :(得分:1)

我自己尝试了一些东西后遇到了这个帖子(应该先搜索一下!) http://snippets.dzone.com/posts/show/11345 - 可能是一个很好的方法,可能很糟糕,但它是分布式的(无服务器),这很好。

答案 3 :(得分:0)

旧的DCE ("Distributed Computing Environment")曾经拥有分布式时间同步解决方案,具备所有这些功能。它被称为DTS。管理员可以配置要同步的计算机集,并计算和提供延迟或不确定性。如果任何机器不同步,它的时钟会慢慢调整,直到它再次同步。保证任何机器上的时间永远不会向后调整(违反基本物理)。网络需要至少一个NTP输入才能与“真实世界”保持同步。

我不知道那段时间同步的东西,或者一般的DCE代码。

在我看来,你不需要“用Java”解决方案。您需要同步一组分布式计算机的时钟。 Java应用程序就是在机器上运行的东西。