Как эффективно отслеживать изменения в удаленном месте? - PullRequest
3 голосов
/ 01 марта 2011

Мы должны отслеживать изменения в файле удаленной системы, который мы получаем через FTP, SMB. У нас нет доступа по SSH к удаленной системе / ОС. Наш единственный взгляд на удаленную систему - это то, что нам позволяют видеть FTP или Samba.

Что мы делаем сегодня:

периодически сканирует весь каталог, создает представление в памяти для выполнения наших задач, а затем объединяет его с тем, что имеется в базе данных.

Что бы мы хотели сделать:

Возможность определить, изменился ли каталог, и, следовательно, требуется ли синтаксический анализ. В идеале, никогда не нужно делать полный анализ. Мы не хотим слишком полагаться на возможности ОС (inode) ..., поскольку она может измениться с установки на другую.

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

Ссылки, которые мы обсуждаем в данный момент:

  • Проверка размера папки
  • с использованием контрольной суммы в файле
  • Проверка последней даты изменения папки / файла

Что мы действительно хотим:

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

Заранее спасибо, куча коллег-разработчиков; -)

Мы используем стек java / spring / hibernate, но я не думаю, что это имеет здесь большое значение.

Редактировать : в основном мы имеем доступ к FTP-серверу или эквивалентному ему. Локальная копия не вариант, так как объем данных слишком велик.

Ответы [ 4 ]

3 голосов
/ 06 октября 2013

Библиотека Remote Directory Poller для Java (rdp4j) может помочь вам опрашивать ваше местоположение FTP и уведомлять вас о следующих событиях: файл добавлен / удален / изменен в каталоге. Он использует дату lastModified для каждого файла в каталоге и сравнивает их с предыдущим опросом.

См. Полное Руководство пользователя , в котором содержатся реализации FtpDirectory и MyListener, приведенные ниже в кратком руководстве по API:

package example

import java.util.concurrent.TimeUnit;
import com.github.drapostolos.rdp4j.DirectoryPoller;
import com.github.drapostolos.rdp4j.spi.PolledDirectory;

public class FtpExample {

    public static void main(String[] args) throws Exception {
        String host = "ftp.mozilla.org";
        String workingDirectory = "pub/addons";
        String username = "anonymous";
        String password = "anonymous";
        PolledDirectory polledDirectory = new FtpDirectory(host, workingDirectory, username, password);

        DirectoryPoller dp = DirectoryPoller.newBuilder()
        .addPolledDirectory(polledDirectory)
        .addListener(new MyListener())
        .setPollingInterval(10, TimeUnit.MINUTES)
        .start();

        TimeUnit.HOURS.sleep(2);

        dp.stop();
    }
}
2 голосов
/ 02 марта 2011

Как упоминалось ранее, вы не можете отслеживать каталоги через FTP или SMB. Что вы можете сделать, это перечислить все файлы на удаленном сервере и создать снимок, который содержит:

  • для файла: имя, размер и дата изменения,
  • для каталога: имя и дата последнего изменения среди его содержимого,

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

2 голосов
/ 01 марта 2011

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

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

Мое предложение заключается в использовании готового программного обеспечения для созданиялокальный клон (например, rsync, robocopy), затем выполните сравнение / анализ локального клона.Вопрос "обновлен ли он" - это вопрос, на который rsync должен ответить.

1 голос
/ 01 марта 2011

Безопасное и переносимое решение - использовать надежную хеш-код / ​​контрольную сумму, такую ​​как SHA1 или (предпочтительно) SHA512. Хеш может быть сопоставлен с любым представлением, которое вы хотите вычислить и сохранить. Вы можете использовать следующий рекурсивный рецепт (адаптированный из системы контроля версий Git):

  1. Хеш файла - это хэш его содержимого, независимо от имени;
  2. для хэширования каталога, рассмотрите его как отсортированный список пар имя файла-хэш в текстовом представлении и хэшируйте его.

Возможно добавьте f к каждому файлу и d к каждому представлению каталога перед хэшированием.

Вы также можете поставить каталог под управление версиями, используя Git (или Mercurial, или что угодно), периодически git add все в нем, используйте git status, чтобы узнать, что было обновлено, и git commit изменения.

...