Как синхронизировать папку между сервером node.js и приложением node.js
Клиентское приложение node.js должно синхронизировать папку с удаленным сервером node.js. Оба работают на окнах. Синхронизация должна быть только односторонней, от сервера к клиенту, и некоторый способ узнать, когда она будет завершена, был бы хорош. Пропускная способность не является ключевым фактором, весь файл может быть повторно загружен, если есть частичное изменение. Что касается частоты, например, 15-минутные попытки пакетного обновления будут нормальными.
Какой подход или библиотеку было бы предпочтительнее сказать, передавая xml представления содержимого папки и загружая каждый измененный файл?
Спасибо
2 ответа
Самый простой способ написать собственную одностороннюю синхронизацию одного каталога файлов работает следующим образом:
Клиент собирает список файлов, которые у него есть на данный момент, и некоторую информацию о версии для каждого файла (номер версии, CRC, время создания файла orig).
Клиент отправляет этот список на сервер в запросе ajax.
Сервер получает список файлов клиента и сравнивает его со своим списком файлов. Затем он возвращает клиенту три списка файлов: 1) файлы для обновления, загрузив последнюю версию, 2) файлы на клиенте для удаления, 3) новые файлы для загрузки клиентом. Списки 1) и 3) могут быть объединены в некоторых реализациях, но иногда полезно знать, какие файлы являются новыми.
Клиент приступает к работе, обрабатывая эти команды, загружая новые / измененные файлы и удаляя любые файлы, которые должны быть удалены.
Когда клиент завершил загрузку, он может создать собственное уведомление о завершении процесса.
Есть несколько ключевых аспектов этого процесса. Во-первых, важна какая-то идентификационная информация о версии. Простейшая схема здесь состоит в том, что сервер отслеживает монотонно увеличивающийся номер версии для каждого файла, так что каждый раз, когда файл изменяется на сервере, этот номер версии увеличивается. Когда файл передается клиенту, клиент также знает, что номер версии и номер версии не могут быть потеряны. Если не удобно хранить отдельный номер версии, можно использовать дату / время изменения файла, но клиент должен быть очень осторожным, когда он обновляет свои собственные файлы, чтобы установить дату и время изменения точно такими, какие он есть. должен соответствовать дате / времени сервера, а не просто принимать дату / время, когда он был последний раз записан локально на клиенте, потому что это не время последнего изменения сервера.
Номера версий также могут быть сохранены в имени файла в виде идентифицируемого суффикса, такого как core-scripts-v11. В этом случае фактическое имя файла для внешнего мира будет core-scripts, но оно будет сохранено в хранилище как core-scripts-v11, чтобы указать, что это версия 11. Если этот файл изменен на новую версию, то новая версия станет core-scripts-v12. Любое сравнение этого со списком клиентских файлов должно сравнивать как имя ядра, так и версии по отдельности, а не только необработанные имена файлов.
Если вам нужна операция атомарной синхронизации, когда всегда передается согласованный набор файлов, и вы никогда не сможете получить часть более новой партии файлов и часть более старой партии файлов, тогда нужно выполнить еще большую работу. Когда файлы обновляются на сервере, они должны обновляться атомарным способом, чтобы клиент во время синхронизации с предыдущей версией не прерывался. Скорее всего, это можно сделать, поддерживая несколько версий репозитория сервера, чтобы клиент, выполняющий синхронизацию с существующей версией репозитория, мог продолжить и завершить синхронизацию с репозиторием, и установка более новых файлов не будет прерывать это. Опять же, есть много возможных способов решения этой конкретной проблемы.
Вы ищете клон для Dropbox, который будет отслеживать файлы на наличие изменений и так далее, поэтому я могу предложить: