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

StackOverflow https://stackoverflow.com/questions/622392

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

<Ол>
  • Сохраните файл с уникальным именем файла.
  • Как только файл будет отправлен, переместите его в подкаталог, например, например. <Код> завершена .
  • Предполагая, что существует только один процесс получателя, все, что нужно сделать получателю:

    <Ол>
  • Периодически проверяйте каталог завершено на наличие файлов.
  • Как только файл появится в complete , переместите его в подкаталог, например, например. обработано и начните работать над этим оттуда.
  • При желании удалите его, когда закончите.
  • В любой нормальной файловой системе перемещения файлов являются атомарными, если они происходят в одной и той же файловой системе / томе. Таким образом, нет никаких условий гонки.

    Несколько получателей

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

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

    Другие советы

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top