跨群集同步文件处理



>我运行一个包含同一微服务的 2 个或更多实例的集群。它们中的每一个都访问共享数据共享上的文件,共享数据共享在运行微服务的两台服务器上作为本地文件夹装载。每个文件只能处理一次(在整个集群中(。我想让节点在平行中处理这些文件,所以没有文件在整个群集中多次。

寻找如何解决它的想法

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

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

知道如何以良好的方式解决它吗?

这样的东西可能会起作用:

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...( (

最新更新