Как надежно обрабатывать файлы, периодически загружаемые внешним агентом? - PullRequest
1 голос
/ 07 марта 2009

Это очень распространенный сценарий: какой-то процесс хочет сбросить файл на сервере каждые 30 минут или около того. Просто, правда? Ну, я могу придумать, как это может пойти не так.

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

С другой стороны, файлы имеют большой размер, поэтому их загрузка занимает несколько минут. Я не хочу начинать обработку частичного файла. Файлы просто передаются по FTP или sftp (мое предпочтение), поэтому блокировка на уровне ОС не возможна.

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

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

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

Ответы [ 3 ]

1 голос
/ 09 марта 2009

Если ОС поддерживает это, используйте перехватчики файловой системы, чтобы перехватывать операции открытия и закрытия файлов. Что-то вроде Dazuko . Другие операционные системы могут сообщать вам о файловых операциях другим способом, например Novell Open Enterprise Server позволяет вам определять эпохи и читать список файлов, измененных в течение эпохи.

Только что понял, что в Linux вы можете использовать подсистему inotify или утилиты из пакета inotify-tools

1 голос
/ 07 марта 2009

Ключ должен сделать начальное жонглирование в конце отправки . Все, что нужно сделать отправителю:

  1. Сохраните файл с уникальным именем файла.
  2. Как только файл будет отправлен, переместите его в подкаталог, например, например. completed.

При условии, что существует только один процесс получателя, все, что нужно сделать получателю:

  1. Периодически проверять каталог completed на наличие файлов.
  2. Как только файл появится в completed, переместите его в подкаталог, например, например. processed, и начните работать над этим оттуда.
  3. При необходимости удалите его, когда закончите.

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

Несколько приемников

Если обработка может занять больше времени, чем период между доставляемыми файлами, вы создадите резерв, если у вас нет нескольких процессов получателя. Итак, как обращаться с делом с несколькими приемниками?

Простой: каждый процесс получателя работает точно так же, как и раньше. Ключевым моментом является то, что мы пытаемся переместить файл в processed до того, как будет работать над ним: тот факт, что перемещение файлов с одинаковой файловой системой является атомарным, означает, что даже если несколько получателей видят один и тот же файл в completed и попробуйте переместить его, удастся только одному. Все, что вам нужно сделать, - это убедиться, что вы проверили возвращаемое значение rename() или любой другой вызов ОС, который вы используете для выполнения перемещения, и продолжите обработку только в случае успеха. Если перемещение не удалось, сначала туда попал какой-то другой получатель, поэтому просто вернитесь и снова просмотрите каталог completed.

0 голосов
/ 08 марта 2009

Передача файлов - одна из классик системной интеграции. Я бы порекомендовал вам получить книгу Enterprise Integration Patterns , чтобы составить свой собственный ответ на эти вопросы - в некоторой степени, ответ зависит от технологий и платформ, которые вы используете для реализации конечных точек и для передачи файлов , Это довольно полный набор работоспособных шаблонов, и довольно хорошо написан.

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