如果您有一项任务只想在服务器群集上仅运行一次,那么定期执行此操作的最佳方法是什么?在这种情况下,群集的定义是2台或更多台具有负载均衡器后面的分布式会话的相同服务器。
用例:您有一项运行成本很高的任务,该任务每X小时只能运行一次。例如,此作业可以遍历一堆记录并更新其状态。
- 最糟糕的情况是,两次运行作业会使您的数据无效。
- 最好的情况是该作业利用了所有服务器上的资源。
要求摘要:
- 即使节点之一关闭,该作业仍必须运行。
- 每个计划只能运行一次作业。
- 如果在同一时间或重叠时间安排了多个作业,则正在运行的作业数将在服务器之间平均分配。
- 机器必须具有相同的代码库,并且必须通过NTP进行同步。
- 根据环境变量,节点之间的配置可能有所不同。
- 作业必须按时开始或在指定时间的给定间隔内开始。(例如说5分钟)
可能的解决方案
- 将一个节点设置为主节点,这违反了上面的1,因此无效。
- 要求负载均衡器平衡以启动该作业。不幸的是,这具有副作用,如果您同时运行多个作业,则它们可能都由同一台机器运行。
这必须在Java的servlet容器中运行。但是,它不是我正在寻找的工作的编码。
当然,这是已知最佳解决方案可以解决的问题。
相关问题。 /programming/5949038/schedule-job-executes-twice-on-cluster
这不是重复的,因为根据上述5个要求,解决方案还不够。最高支持的解决方案存在种族问题,第二种解决方案违反了要求3