Разрешить только одному серверу доступ к файлу на сетевом диске - PullRequest
2 голосов
/ 21 октября 2008

У меня есть приложение, работающее на нескольких серверах IIS, которым необходимо проанализировать файл CSV, который находится на общем сетевом диске. Если я использую событие System.IO.FileSystemWatcher Created для уведомления о событии, когда файл доступен, как я могу гарантировать, что только один сервер проанализирует файл? Если все серверы будут уведомлены об этом изменении, все попытаются его проанализировать. Должен ли первый сервер скопировать это локально, а затем проанализировать? Это вызвало бы ошибки на других серверах? Нужно ли настроить удаленный доступ к каталогу, чтобы разрешить доступ только на чтение одному серверу?

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

Ответы [ 2 ]

2 голосов
/ 21 октября 2008

Ключевой вопрос: происходит ли что-то плохое, когда все они пытаются проанализировать файл примерно в одно и то же время? Множественный доступ на чтение в основном разрешен на уровне файловой системы, поэтому сам по себе этот факт не обязательно что-либо нарушит.

Возможно, я бы попробовал создать файл блокировки при первом обращении к файлу и заставить серверы искать файл блокировки перед доступом к файлу. Удалите файл блокировки, когда закончите.

Вы также можете установить эксклюзивную блокировку для файла, только один сервер сможет сделать это одновременно. Другие потерпят неудачу, пытаясь:

FileStream fs = new FileStream(
  FilePath, 
  FileMode.Open,
  FileAccess.ReadWrite, 
  FileShare.None
);
0 голосов
/ 29 октября 2008

Другой вариант вместо блокировки - переименовать файл в каталог. Создайте подкаталог для каждого сервера, а затем попросите сервер переименовать файл в его каталог (переименование является атомарной операцией). Успешный получает парсинг файла.

Проблема с блокировкой будет сложной, поскольку файл все равно будет виден каждому серверу, и они могут попытаться открыть файл, а затем повторить ошибку. Переименование будет абсолютным в отношении владельца файла.

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

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

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