Несколько серверов с FileSystemWatcher в одном каталоге

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

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

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


person DJCasey    schedule 14.09.2011    source источник
comment
К сожалению, я не могу предложить решение, но скажу, что пробовал то, что вы сказали, перед использованием FSW, и возникает слишком много проблем (при перетаскивании более 20 файлов из Win7 он их не берет и т. Д. ..). Я закончил тем, что сохранил хэш-карту имен файлов для времени доступа и еще много чего и использовал его для отслеживания новых / измененных файлов (может показаться медленным, но переписанный на C, он прошел намного быстрее). Это было мое решение, но оно может не сработать для вас, поэтому это комментарий (и притом длинный).   -  person Jesus Ramos    schedule 14.09.2011


Ответы (3)


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

person Vincent Van Den Berghe    schedule 14.09.2011
comment
Я сам думал об этом, но хотел избежать этого, потому что желательно, чтобы серверы работали независимо и, таким образом, обеспечивали избыточность. Я думаю, мне просто нужно было настроить аварийное переключение для мастера. Спасибо. - person DJCasey; 15.09.2011

У меня был бы только один сервер / служба, отслеживающая эту папку и записывающая в путь к файлу базы данных и изменяющая дату и событие (копирование, переименование ...), тогда у вас могут быть все службы, которые вы хотите получить, одну из этих недавних новых записей в этой таблице, заблокировать его и обработать. В основном, поскольку FSW плохо работает с параллелизмом, мы переносим обработку параллелизма в базу данных.

person Davide Piras    schedule 14.09.2011
comment
Спасибо за ответ, но цель состоит в том, чтобы на данном этапе не допустить попадания в базу данных - это приводит к другим проблемам. - person DJCasey; 15.09.2011

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

person Waqar    schedule 14.09.2011