【问题标题】:What would be a good design to achieve this synchronization across machines..?什么是实现跨机器同步的好设计..?
【发布时间】:2011-11-04 11:42:50
【问题描述】:

我有 2 台机器,每台机器都运行一个进程。机器 A 上的 shell 进程将向机器 B 发送一些东西,而 B 上的 java 进程将使用这些文件。两个进程都作为 crontab 任务运行。

如何实现同步/原子性等?如何表示已写入整个文件。

因此 B 上的进程始终可以访问最新和完整的文件,处理程序不会过时..

【问题讨论】:

    标签: java process synchronization atomic


    【解决方案1】:

    假设您正在使用具有原子移动的文件系统,您可以做到这一点。或者使用符号链接。

    A 将文件复制到 B 上的临时位置。上传完成后,它会通过移动或符号链接将文件重新定位到预期位置。然后 B 只能看到完全上传的文件。

    如果您在 A 上的进程无法通过 SSH 连接到 B 以进行最后一步,则可以添加另一个指示上传完成的零字节标记文件。

    A 上传 FOO.txt,上传完成后,它会创建 FOO.txt.done 文件。 B 然后扫描目录中的 *.done 文件,并使用关联的数据文件。当然还有清理。

    【讨论】:

    • A 上的进程可以在 B 机器上做这些原子动作吗?
    • 更新后表示您可以通过 SSH 进行移动,或使用标记文件来指示完成。
    • 如果你记得它,那么使用 ssh 进行移动的命令是什么?
    • ssh user@host 'mv /path/a /path/b' :)
    • 而且这个动作保证是原子的..?甚至超过ssh?我的意思是,ssh 确保它是原子的?
    【解决方案2】:

    可以通过使用用户控制来解决问题的快速解决方法/解决方案所有权/权限,以便 B 上的进程能够访问该文件。

    【讨论】:

      【解决方案3】:

      我可以建议我猜的一些技巧。您可以:-

      1. 在文件写入开始时创建一个临时文件(如锁定文件),该文件的存在意味着正在写入流式传输的文件,并在写入完成后删除临时文件。 或
      2. 删除消费者进程上的 crontab 并让 scp 进程发送信号(JMS/单播)。 Java 进程可以只是队列/套接字上的侦听器,也可以在接收到单播时被调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-14
        • 1970-01-01
        • 2010-10-30
        相关资源
        最近更新 更多