跨集群同步文件处理

时间:2019-04-17 10:12:34

标签: java multithreading file microservices

我运行一个包含两个或两个以上同一微服务实例的集群。 他们每个人都访问共享数据共享上的文件,该文件作为运行两个服务的两台服务器上的本地文件夹安装。每个文件只能处理一次(在整个集群中)。 我想按节点在并行处理这些文件,所以没有文件 在整个集群中不止一次。

寻找解决方法的想法

我已经考虑过一个节点读取文件并将其文件名放入队列,以便节点可以从队列中读取文件。

还考虑过通过数据库进行同步,其中每个节点在尝试处理文件时都使用db与其他节点进行同步。

有什么想法可以很好地解决吗?

1 个答案:

答案 0 :(得分:0)

类似的事情可能起作用:

String pathToFile = "/tmp/foo.txt";
try {
    Files.createFile(FileSystems.getDefault().getPath(pathToFile + ".claimed"));
    processFile(pathToFile);
} catch (FileAlreadyExistsException e) {
    // some other app has already claimed "filename"
}

,您将需要这些导入:

import java.nio.file.FileAlreadyExistsException;
import java.nio.file.FileSystems;
import java.nio.file.Files;

这个想法是,每个应用程序实例仅在首先能够在同一共享文件系统中创建".claimed"文件的情况下,才同意在任何给定文件上工作。这是由于Files.createFile的行为而引起的:

  

创建一个新的空文件,如果该文件已存在则失败。检查文件是否存在以及是否创建新文件(如果不存在)是单个操作,对于可能影响目录的所有其他文件系统活动而言,这是原子操作。

(来自此Javadoc: https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#createFile(java.nio.file.Path,%20java.nio.file.attribute.FileAttribute...)