三个系统之间可靠的文件传输

三个系统之间可靠的文件传输

我每天需要在三个系统之间传输文件:

  • 供应商 A(SFTP 站点)- 14 天后删除文件

  • 供应商 B(SFTP 站点)- 处理文件后删除它们

  • 公司服务器 (Windows 2008) - 将文件存储为备份

我每天都想从供应商 A 下载新文件到我们公司的服务器,然后将其上传到供应商 B。使用简单文件传输脚本的缺点是,从供应商 A 到公司服务器的文件传输可能会成功,但从公司服务器传输到供应商 B 时可能会失败。因此,供应商 B 丢失了一天的文件。供应商 B 不会告诉我他们何时丢失了文件,而供应商 A 并不总是在某一天生成文件。

关于如何自动化此文件传输场景的任何想法,以便在发生故障时系统可以稍后再试?

答案1

您只需添加一些逻辑,在一段时间后重试上传到供应商 B。如果失败次数达到最大次数,请记录错误或发送电子邮件,让支持团队手动验证。

如果您预计供应商 A 不会每天生成文件,请确定缺失的日子有多重要,然后决定是否也应该为这些日子生成警报/电子邮件(例如,您必须致电供应商 A 以检查文件在预期时间丢失的原因)。

答案2

我会做:

  1. 文件的单向同步(供应商 A -> 公司服务器“备份”文件夹)。
  2. 将新下载的文件克隆到包含要上传的文件的单独文件夹(“上传”文件夹)。
  3. 检查“备份”文件夹中的最新文件有多旧。如果超过 X 天,则发出警报。
  4. 尝试将所有(不仅仅是新)文件从“上传”文件夹上传到供应商 B
  5. 从“上传”文件夹中删除已成功上传的文件
  6. 对任何(下载或上传)错误发出警报

每天至少重复一次,最好是几天。或者每天重复步骤 1-3 一次,但每天重复步骤 4-6 几次。

使用 PowerShell 的可能实现:

  1. 使用WinSCP .NET 程序集方法Session.SynchronizeDirectories

    $synchronizationResult = $session.SynchronizeDirectories(
        [WinSCP.SynchronizationMode]::Local, "c:\backup\", "/remote_path/", $False)
    
  2. 迭代SynchronizationResult.DownloadsCopy-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.TransfersRemove-Item每次:

    foreach ($transfer in $transferResult.Transfers)
    {
        if ($transfer.Error -eq $Null)
        {
            Remove-Item $transfer.FileName
        }
    }
    
  6. 测试SynchronizationResult.IsSuccessTransferResult.IsSuccess

(我是 WinSCP 的作者)

相关内容