Стратегии распределенного доступа к файлам

64
6

У меня есть служба Windows, написанная на С#, которая контролирует папку для обработки файлов. Когда файлы добавляются в эту папку, служба должна забрать файл и выполнить с ним задачу, потребляя файл в процессе.


Я хотел бы распространять работу над несколькими физическими серверами для отказоустойчивости. Файлы будут размещены на NAS, доступном для всех экземпляров службы.


Существенным требованием является то, что я хотел бы, чтобы каждая служба собирала файл исключительно; файл не должен обрабатываться более чем одной службой.


Есть ли хорошие стратегии для работы с файлами таким образом?

спросил(а) 2021-01-19T15:16:28+03:00 6 месяцев, 1 неделя назад
1
Решение
91

Простейшим решением, как мне кажется, будет создание .lock файла. Поэтому, если ServiceA видит файл с именем myfile.dat, он будет искать файл myfile.dat.lock. Если он не найдет его, он создаст его; службы подпоследовательности будут видеть файл myfile.data.lock и пропустить этот файл.

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

ответил(а) 2021-01-19T15:16:28+03:00 6 месяцев, 1 неделя назад
63

Вы можете развернуть Apache ZooKeeper. Когда сервер обработки хочет работать с файлом, он создает и блокирует "node", работает над файлом, а затем разблокирует node. Если однократная обработка файла является важным требованием, я бы не стал откатываться. Это сложнее реализовать, чем кажется, и ZooKeeper справится с этим правильно.

ответил(а) 2021-01-19T15:16:28+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема