【问题标题】:Is there an off-the-shelf clock synchronization solution for Java?Java 是否有现成的时钟同步解决方案?
【发布时间】:2010-10-30 16:35:36
【问题描述】:

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

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

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

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

1) 如果所有进程都在同一台机器上,是否可以保证 currentTimeMilis 在调用时是准确的? ITP的错误是否有一定的界限?

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

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

    在NTP误差范围方面,有解决方案:

    我的建议:

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

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

    编辑

    在 Cheeso 的帖子中,我发现

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

    http://sourceforge.net/projects/freedce

    那里可能有 DCE Java 绑定。

    【讨论】:

    • 我记得大学时的那本书。我们现在的项目正在寻找快速且相当准确的东西,我们不能成为第一个需要这种东西的人。我想知道是否有现成的实现。
    • 我不知道,但是使用 JVM 会有很多延迟。程序环境不是高度耦合的,并且可以停止(在 GC 等上)。但是,我不是 Java 专家。
    【解决方案2】:

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

    NTPv4 在公共 Internet 上通常可以将时间保持在 10 毫秒 (1/100 s) 以内,并且在理想条件下在局域网中可以达到 200 微秒 (1/5000 s) 或更好的精度。

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

    [1]Wikipedia: Network Time Protocol

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 嗨@Benjamin,似乎指向 dzone 的链接已失效。
      【解决方案4】:

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

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

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

      【讨论】:

      • 我的理解是大多数操作系统使用的同步方法具有很高的误差范围(大约 10-100 毫秒),这对于大多数实践来说是可以接受的。我正在考虑通过 Java 来做这件事,因为我可能能够使用更准确的服务。
      • @Cheeso - DCE 领先于时代 :)
      • @Uri - 是的,我知道你想要一个更准确的解决方案。我只是想说,可以独立于任何 Java 代码进行同步。可以将时间同步部分完全排除在 Java 应用程序之外,因此 Java 应用程序中的设计假设是“时间是同步的”。但这个设计选择是你自己做的! b
      • @Aiden - 我知道!我们只是不断地重新发明相同的东西。
      • @Cheeso - 还是一样的老故事。
      猜你喜欢
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 2011-01-23
      相关资源
      最近更新 更多