java - 如何确认同一任务是否在多个服务器实例上完成

标签 java algorithm cron scheduled-tasks multiple-instances

我有调度程序作业,每隔 X 分钟检查 sftp 服务器上是否有某个文件,下载它,解析并上传状态文件,表明该文件已成功下载。如果文件未成功下载和解析,我们不会上传状态文件。

状态文件由第 3 方应用程序使用,如果状态文件存在于 sftp 服务器上,它就会开始做另一项工作。如果没有状态文件,它将不会启 Action 业。

问题始于运行相同调度程序作业的多个服务器实例。我不知道如何确保所有服务器都成功下载文件并告诉第 3 方应用程序状态文件它可以开始他的工作的最佳方式?

我与这个第 3 方应用程序通信的唯一方式是通过状态文件。

一些解决方案:

  1. 之前我们只在一台服务器上运行调度程序作业,并且它们之间共享磁盘以使用这些文件。这不再是一个选择

  2. 我想上传一个格式错误的状态文件(这样第 3 方应用程序就不会开始他的工作)和一些服务器 ID,这将确认该服务器已经下载了文件。所有其他服务器也将把它们的 id 放在同一个文件中。然后,第一个服务器会发现至少有 3 次提及相同的服务器 ID(3x server1、3x server2、3x server3),它将以正确的格式更改状态文件,然后第 3 方可以开始他的工作。理论上,如果在文件中提到 server1 和 server2 3 次,但根本没有提到 server3(所有服务器都有相同的 cron 表达式,比如每 2 分钟一次)

  3. 使用一些配置来定义需要下载文件的服务器数量,并且基于该配置我可以检查是否所有服务器都将其 ID 写入虚假状态文件。问题是如果我添加新服务器我需要更新配置文件。

我想这是一个常见问题并且有某种模式或算法?

最佳答案

如果我是你,我会尝试在第 3 方应用程序和 sftp 服务器之间创建一个“接口(interface)文件”。 “接口(interface)文件”将定期(每 X 分钟)更新一次。如果状态文件就绪(全部),那么只有“接口(interface)文件”会被标记为“就绪”。然后将此“接口(interface)文件”发送到第 3 方应用程序。

希望对你的问题有所帮助

编辑:语法

关于java - 如何确认同一任务是否在多个服务器实例上完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55673283/

相关文章:

Java:将一组字符转换为单个字符串

c# - 添加访问列表

ios - 非常简单的 C 代码有问题

node.js - node-cron 无法正常工作?

python - 防止运行 python 脚本的并发实例

linux - 在 Plesk 11 的 shellscript cron 作业中找不到命令错误

java - 如何使用Java在Alfresco 5.0中获取对等关联节点?

java - 如何从 Map<K, Collection<V>> 创建 Multimap<K,V>?

c++ - 如何理解频率图像中描述的平均像素数?

java - JPA/Hibernate 对 Oracle 序列的增量太多