NodeJS: Как можно наблюдать за обновлениями большого количества файлов / папок на стороне сервера? - PullRequest
9 голосов
/ 06 апреля 2011

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

Первое решениеЯ наткнулся на fs.watchFile , который был затронут в других вопросах, связанных со стековым потоком.В первом вопросе пользователь Иво Ветцель отметил, что в системе linux fs.watchFile использует inotify, но считает, что fs.watchFile не следует использовать для большого количества файлов /папки.

В другом вопросе о пользователе fs.watchFile tjameson впервые подтвердил, что в Linux inotify будет использоваться fs.fileWatch, и порекомендовал просто использовать комбинацию node-inotify-plusplus и node-walk , но еще раз заявил, что этот метод не следует использовать для большого количества файлов.С комментарием и ответом он предложил только наблюдать за измененным временем каталогов и затем повторно сканировать соответствующий каталог для изменений файла.

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

  • создание файла или подпапки
  • удаление файла или подпапки
  • перемещение файла или подпапки
  • удаление себя
  • движение себя

Если предположить, что inotify имеет пределы в соответствии с тем, что было сказано выше, то мне одному кажется, что когда у менязначительное количество вложенных подпапок.По-настоящему удивительный способ выглядит так, как будто он включает kqueue , который я впоследствии нашел в качестве темы для обсуждения лучшего fs.fileWatch в группе Google .

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

Так, что думает сообщество?Есть ли лучшее или хорошо известное решение для решения этой проблемы, о котором я просто не знаю?Лучше всего просто просмотреть все интересующие каталоги за одним изменением, например, измененным временем, а затем сканировать, чтобы выяснить, что произошло?Лучше ли смотреть все соответствующие предупреждения inotify и соответствующим образом изменять базу данных?Разве это не проблема, которую решает такой крестьянин, как я?

Ответы [ 2 ]

2 голосов
/ 06 апреля 2011

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

0 голосов
/ 07 апреля 2011

Я рекомендую вам взглянуть на Dropbox API .

Я реализовал нечто подобное с ruby ​​на стороне клиента и nodejs на стороне сервера.Наилучший подход - хранить хэши, чтобы проверить, не изменились ли файлы или папки.

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