我有调度程序作业,每隔 X 分钟检查 sftp 服务器上是否有某个文件,下载它,解析并上传状态文件,表明该文件已成功下载。如果文件未成功下载和解析,我们不会上传状态文件。
状态文件由第 3 方应用程序使用,如果状态文件存在于 sftp 服务器上,它就会开始做另一项工作。如果没有状态文件,它将不会启 Action 业。
问题始于运行相同调度程序作业的多个服务器实例。我不知道如何确保所有服务器都成功下载文件并告诉第 3 方应用程序状态文件它可以开始他的工作的最佳方式?
我与这个第 3 方应用程序通信的唯一方式是通过状态文件。
一些解决方案:
之前我们只在一台服务器上运行调度程序作业,并且它们之间共享磁盘以使用这些文件。这不再是一个选择
我想上传一个格式错误的状态文件(这样第 3 方应用程序就不会开始他的工作)和一些服务器 ID,这将确认该服务器已经下载了文件。所有其他服务器也将把它们的 id 放在同一个文件中。然后,第一个服务器会发现至少有 3 次提及相同的服务器 ID(3x server1、3x server2、3x server3),它将以正确的格式更改状态文件,然后第 3 方可以开始他的工作。理论上,如果在文件中提到 server1 和 server2 3 次,但根本没有提到 server3(所有服务器都有相同的 cron 表达式,比如每 2 分钟一次)
使用一些配置来定义需要下载文件的服务器数量,并且基于该配置我可以检查是否所有服务器都将其 ID 写入虚假状态文件。问题是如果我添加新服务器我需要更新配置文件。
我想这是一个常见问题并且有某种模式或算法?
最佳答案
如果我是你,我会尝试在第 3 方应用程序和 sftp 服务器之间创建一个“接口(interface)文件”。 “接口(interface)文件”将定期(每 X 分钟)更新一次。如果状态文件就绪(全部),那么只有“接口(interface)文件”会被标记为“就绪”。然后将此“接口(interface)文件”发送到第 3 方应用程序。
希望对你的问题有所帮助
编辑:语法
关于java - 如何确认同一任务是否在多个服务器实例上完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55673283/