我们有一个 java 进程,它使用 apache commons vfs 监听文件系统上的目录 X。每当一个新文件被导出到这个目录时,我们的流程就会启动。我们首先将文件重命名为 filename.processing 并解析文件名,从文件中获取一些信息并插入到表中,然后将此文件发送到文档管理系统. 这是每个集群的单线程应用程序。现在考虑在集群环境中运行,我们有 5 个服务器。所以 5 个不同的虚拟机试图访问同一个文件。整个实现是基于在给定时间只有一个进程可以将文件重命名为 .processing ,因为操作系统不允许多个进程同时修改文件。一旦一个集群得到持有并将文件重命名为.processing,其他集群'
一年多以来一直运行良好,但刚才我们发现很少有重复项。看起来多个集群都掌握了文件,在这种情况下,集群 a、b、c 已经获得了文件 f.pdf 的访问权限,并且他们同时将其重命名为 f.pdf.processing,(我仍然感到困惑操作系统如何允许同时修改文件)。作为这些的结果,集群 a、b、c 他们处理了文件并将其发送到文档管理系统。所以现在有3个重复文件。
所以简而言之,我正在看的是,在集群环境中只运行一次任务的方法。我还希望它具有故障转移机制,这样如果集群出现问题,另一个集群会接手任务。我们不想在盒子上设置环境变量,比如 master=true,因为这会将它限制为只有一个集群并且不会处理故障转移。
任何形式的帮助表示赞赏。