Синхронизировать обработку файлов в кластере - PullRequest
0 голосов
/ 17 апреля 2019

Я запускаю кластер, содержащий 2 или более экземпляров одного и того же микросервиса.Каждый из них имеет доступ к файлам на общем ресурсе данных, который монтируется как локальная папка на обоих серверах, на которых работают микросервисы.Каждый файл может быть обработан только один раз (во всем кластере).Я хочу, чтобы эти файлы обрабатывались в parellel по узлам, поэтому ни один файл не встречается более одного раза во всем кластере.

В поисках идеи, как ее решить

Я уже думал об одном узлечтение файлов и помещение их имен файлов в очередь, чтобы узлы могли читать их из очереди.

Также задумывался о синхронизации через базу данных, где каждый узел при попытке обработки файла использует db для синхронизации с другими узлами.

Есть идеи, как это решить?

1 Ответ

0 голосов
/ 17 апреля 2019

что-то вроде этого может работать:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...