如何确认在多个服务器实例上是否完成了相同的任务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何确认在多个服务器实例上是否完成了相同的任务相关的知识,希望对你有一定的参考价值。

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

状态文件由第三方应用程序使用,如果状态文件存在于sftp服务器上,它将开始执行另一项工作。如果没有状态文件,则无法启动该作业。

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

我与第三方应用程序通信的唯一方法是通过状态文件。

一些解决方案

  1. 在我们仅在一台服务器上运行调度程序作业并在它们之间共享磁盘以使用此文件之前。这不再是一个选择
  2. 我正在考虑以错误的格式上传状态文件(以便第三方应用程序不启动他的工作),并使用一些服务器ID,这将确认该服务器已下载该文件。所有其他服务器也会将其ID放在同一个文件中。然后,第一台服务器将发现至少3次提到相同的服务器ID(3x server1,3x server2,3x server3),它将以正确的格式更改状态文件,然后第三方可以开始他的工作。从理论上讲,如果在文件中提到server1和server2的3倍,可能会出现问题,但是根本没有提到server3(所有服务器都有相同的cron表达式,比如每2分钟一次)
  3. 使用一些配置,其中将定义需要下载文件的服务器数量,并根据该配置我可以检查是否所有这些服务器都在伪状态文件中写入了他们的ID。问题是如果我添加新服务器我需要更新配置文件。

我想这是常见的问题,有一些模式或算法?

答案

如果我是你,我会尝试在第三方应用程序和sftp服务器之间创建一个“接口文件”。 “接口文件”将定期(每隔X分钟)更新一次。如果状态文件已准备就绪(所有这些),则只有“接口文件”将标记为“就绪”。然后将此“界面文件”发送到第三方应用程序。

希望它有助于解决您的问题

编辑:语法

以上是关于如何确认在多个服务器实例上是否完成了相同的任务的主要内容,如果未能解决你的问题,请参考以下文章

使用 CloudFormation 在 ECS 服务上定义多个任务

保存在服务器上的位置的接近警报

使用 TPL 在多个不同线程上创建单例对象

使多个 Worker 角色实例执行相同工作的推荐方法是啥?

阿里云ECS无法连接到服务器怎么解决?

如何让我的 nodejs 应用程序为多个用户服务?