Delphi - синхронизация папок по сети - PullRequest
3 голосов
/ 05 июля 2011

У меня есть приложение, которое подключается к базе данных и может использоваться в многопользовательском режиме, в результате чего несколько компьютеров могут подключаться к одному и тому же серверу базы данных для просмотра и изменения данных. Один из клиентов всегда назначается «главным» клиентом. Этот мастер также получает текстовую информацию от входа RS232 или UDP и каждую секунду регистрирует эти данные в текстовом файле на локальном компьютере.

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

  1. Создать класс синхронизации папки для синхронизации папки на удаленном (главном) компьютере с папкой на локальном (клиентском) компьютере. Это будет подпрограмма копирования потокового буферизованного файла.
  2. Реализуйте клиент / сервер, чтобы главный компьютер мог передавать эти данные любому клиенту, который подключается и запрашивает данные. Мастер отправит файл через TCP / UDP запрашивающему клиенту.

Решение должно учитывать следующее:

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

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

с. Будь максимально эффективным

д. Все машины находятся в локальной сети

е. Синхронизация должна выполняться только, скажем, каждые 10 минут или около того.

е. Объем данных составляет только порядка 50 МБ, но после завершения начальной (первой) синхронизации объем передаваемых данных будет порядка 1 МБ. Это увеличится в будущем

Какой метод лучше использовать? Какие плюсы / минусы? Я также видел пост Fast File Copy , который я собираюсь использовать.

Ответы [ 4 ]

6 голосов
/ 05 июля 2011

Если вы используете базу данных, почему «мастер» записывает данные в текстовый файл, а не в базу данных, если эти данные должны использоваться совместно?

3 голосов
/ 05 июля 2011

Зачем изобретать колесо? Вместо этого используйте rsync . Пакет для Windows: cwrsync .

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

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

2 голосов
/ 05 июля 2011

Напишите интерфейс веб-службы, чтобы клиенты могли подключаться к серверу и получать новые данные по мере необходимости. Или вы можете записать его как механизм подписки / рассылки, чтобы клиенты подключались к серверу, «подписывались», а затем сервер передавал весь новый контент зарегистрированным клиентам. Клиенты должны были бы полностью синхронизироваться (получить все изменения с момента последней синхронизации) при регистрации, если они были отключены, когда произошли обновления.

1 голос
/ 05 июля 2011

Оба решения прекрасно работают в локальной сети, выбор за вами. Вы можете также рассмотреть вопросы, связанные с выбранной вами технологией:

  • Гибкость развертывания. Для использования общих файловых ресурсов и копирования файлов необходим общий доступ к файлам, и все пользователи локальной сети могут получить доступ к файлам журнала.
  • Долгосрочные планы: общие файловые ресурсы хороши только в локальной сети, тогда как решения на основе IP работают в маршрутизируемых сетях, включая Интернет.
  • Решение на основе файлов будет значительно легче реализовать по сравнению с решением IP.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...