Batch processing 如何可靠地处理外部代理定期上载的文件?

Batch processing 如何可靠地处理外部代理定期上载的文件?,batch-processing,file-manipulation,Batch Processing,File Manipulation,这是一种非常常见的情况:某些进程希望每隔30分钟左右将一个文件放到服务器上。很简单,对吧?好吧,我能想到很多可能出错的方法 例如,处理一个文件可能需要30分钟以上或不到30分钟,因此在处理前一个文件之前,新文件可能会到达。我不希望源系统覆盖我仍在处理的文件 另一方面,文件很大,所以需要几分钟才能完成上传。我不想开始处理部分文件。这些文件只是通过FTP或sftp(我的首选)传输的,因此操作系统级锁定不是一个选项 最后,我确实需要将文件保留一段时间,以防需要手动检查其中一个文件(用于调试)或重新处理

这是一种非常常见的情况:某些进程希望每隔30分钟左右将一个文件放到服务器上。很简单,对吧?好吧,我能想到很多可能出错的方法

例如,处理一个文件可能需要30分钟以上或不到30分钟,因此在处理前一个文件之前,新文件可能会到达。我不希望源系统覆盖我仍在处理的文件

另一方面,文件很大,所以需要几分钟才能完成上传。我不想开始处理部分文件。这些文件只是通过FTP或sftp(我的首选)传输的,因此操作系统级锁定不是一个选项

最后,我确实需要将文件保留一段时间,以防需要手动检查其中一个文件(用于调试)或重新处理其中一个文件

我已经看到了很多特别的方法来移动上传文件,交换文件名,使用日期戳,触摸“指示符”文件来帮助同步,等等。我还没有看到处理文件的全面“算法”,它解决了并发性、一致性和完整性问题


所以,我想在这里挖掘群众的智慧。有没有人见过一种真正防弹的方法来处理批处理数据文件,这样它们就不会过早处理,在处理之前不会被覆盖,在处理之后会被安全地保存?

关键是在发送端进行初始处理。发件人需要做的只是:

  • 使用唯一的文件名存储文件
  • 文件发送后,立即将其移动到名为
    completed
    的子目录
  • 假设只有一个接收器进程,接收器需要做的就是:

  • 定期扫描
    completed
    目录中的所有文件
  • 一旦文件出现在
    completed
    中,就将其移动到名为
    processed
    的子目录,然后从那里开始处理
  • 完成后可以选择删除它
  • 在任何健全的文件系统上,文件移动都是原子的,只要它们发生在同一文件系统/卷中。所以没有比赛条件

    多接收机 如果处理过程可能需要比文件交付之间的时间更长的时间,那么除非有多个接收方进程,否则您将建立一个积压工作。那么,如何处理多个接收器的情况呢


    简单:每个接收器进程的操作与以前完全相同。关键是,在处理文件之前,我们尝试将文件移动到
    已处理的
    :这意味着,即使多个接收者在
    已完成的
    中看到同一个文件并尝试移动它,也只有一个接收者会成功。您所需要做的就是确保检查
    rename()
    的返回值,或者检查用于执行移动的任何操作系统调用,并且只有在成功后才能继续处理。如果移动失败,其他接收器会先到达那里,因此只需返回并再次扫描
    完成的
    目录。

    文件传输是系统集成的经典之一。我建议您阅读这本书,为这些问题构建自己的答案——在某种程度上,答案取决于您用于端点实现和文件传输的技术和平台。这是一个相当全面的可行模式集合,写得相当好

    如果操作系统支持,请使用文件系统挂钩拦截打开和关闭文件操作。差不多。其他操作系统可能会以其他方式让您了解文件操作,例如,Novell Open Enterprise Server允许您定义历元,以及在历元期间修改的文件列表


    刚刚意识到在Linux中,您可以使用inotify子系统或inotify tools package中的实用程序

    我建议将此问题重命名为“如何可靠地处理外部代理定期上载的文件?”这避免了歧义(对许多人来说,“批处理文件”是指包含cmd.exe命令的文件).一天后没有回应,我很不耐烦,所以我更改了标题…:)重命名没有问题。我在另一个国家呆了一段时间,连通性很差。