我运行一个包含2个或更多相同微服务实例的集群。他们每个人都访问共享数据共享上的文件,共享数据共享作为本地文件夹安装在运行微服务的两台服务器上。每个文件只能处理一次(在整个群集中)。我想通过节点在parellel中处理这些文件,因此整个集群中没有文件多于一次。
寻找想法如何解决它
我已经考虑过一个节点读取文件并将其文件名放入队列,以便节点可以从队列中读取它。
还考虑了通过数据库进行同步,其中每个节点在尝试处理文件时都使用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
的行为:
创建一个新的空文件,如果该文件已存在则失败。检查文件是否存在以及创建新文件(如果不存在)是针对可能影响目录的所有其他文件系统活动的原子操作。