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

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

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

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

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

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

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

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

谢谢!

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

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

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

我的建议:

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

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

编辑

我发现,在Cheeso的post之后

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

http://sourceforge.net/projects/freedce

可能有DCE Java绑定。

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

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

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

[1] 维基百科:网络时间协议

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

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

我不知道那个时间同步的东西发生了什么,或者一般的DCE代码。

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