Назад | Перейти на главную страницу

Надежная передача файлов между тремя системами

У меня есть три системы, которые мне нужны для ежедневной передачи файлов:

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

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

Я бы сделал:

  1. Односторонняя синхронизация файлов (Производитель A -> папка "backup" сервера компании).
  2. Клонируйте только что загруженные файлы в отдельную папку с файлами для загрузки (папка «upload»).
  3. Проверьте, сколько лет самому последнему файлу в папке «резервная копия». Когда старше X дней, оповещать.
  4. Попробуйте загрузить все (не только новые) файлы из папки "upload" в Поставщик B
  5. Удалите файлы, которые вам удалось загрузить, из папки "upload"
  6. Предупреждение о любой ошибке (загрузки или выгрузки)

Повторяйте это не реже одного раза в день, возможно, несколько раз в день. Или делайте шаги 1-3 один раз в день, но шаги 4-6 несколько раз в день.

Возможная реализация с использованием PowerShell:

  1. Использовать Сборка WinSCP .NET метод Session.SynchronizeDirectories:

    $synchronizationResult = $session.SynchronizeDirectories(
        [WinSCP.SynchronizationMode]::Local, "c:\backup\", "/remote_path/", $False)
    
  2. Итерировать SynchronizationResult.Downloads и Copy-Item каждый:

    foreach ($download in $synchronizationResult.Downloads)
    {
        Copy-Item $download.Destination -Destination "C:\upload"
    }
    
  3. Использовать Get-ChildItem чтобы найти последний файл:

    # Find the latest file
    $latest = Get-ChildItem "C:\backup" |
        Sort-Object LastWriteTime -Descending | Select-Object -First 1
    
    # Is the latest file older than 5 days?
    if ($latest.LastWriteTime -lt (Get-Date).AddDays(-5))
    {
        # alert!
    }
    
  4. Используйте метод сборки WinSCP .NET Session.PutFiles:

    $transferResult = $session.PutFiles("C:\upload\*.*", "/remote_path/")
    
  5. Повторять TransferResult.Transfers и Remove-Item каждый:

    foreach ($transfer in $transferResult.Transfers)
    {
        if ($transfer.Error -eq $Null)
        {
            Remove-Item $transfer.FileName
        }
    }
    
  6. Протестируйте как SynchronizationResult.IsSuccess и TransferResult.IsSuccess

(Я автор WinSCP)

Вам просто нужно добавить некоторую логику, чтобы повторить загрузку поставщику B через некоторый период времени. Если вы достигнете максимального количества сбоев, зарегистрируйте ошибку или отправьте электронное письмо, чтобы служба поддержки проверила ее вручную.

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