我们使用Spring来运行可以在单节点上正常工作的计划任务。我们希望在N个节点的集群中运行这些计划任务,这样任务在某个时间点最多由一个节点执行。这是针对企业用例的,我们可能预计高达10到20个节点。集群中使用zookeeper的计划任务
我看着各种选项:
- 使用Quartz这似乎是在一个集群中运行计划任务的热门选择。缺点:我想避免的数据库依赖。
- 使用zookeeper并始终仅在领导/主节点上运行计划任务。缺点:任务执行负载未分布
- 使用zookeeper并在所有节点上调用计划的任务。但是在任务运行之前,一旦执行完成后获得分布式锁定和释放。 缺点:如果应用程序过载导致系统时钟漂移,所有节点上的系统时钟应该同步,这可能是一个问题。
- 使用zookeeper并让主节点按照时间表继续生成任务并将其分配给随机工作人员。如果先前的计划任务尚未完成,则不分配新任务。缺点:这似乎增加了太多的复杂性。
我倾向于使用#3,这似乎是一个安全的解决方案,假设zookeeper合奏节点在单独的群集上运行,系统时钟使用NTP同步。这也假定如果系统时钟同步,那么所有节点都有相同的机会获得执行任务的锁。
编辑:经过一些更多的想法后,我意识到这可能不是一个安全的解决方案,因为系统时钟应该在计划任务运行的节点之间同步,而不仅仅是动物园管理员群集节点。我说的不安全,因为运行任务的节点可能因GC暂停和其他原因而过载,并且可能会出现时钟不同步的情况。但是我再次认为这是分布式系统的标准问题。
你能否告诉我,如果我对每个选项的理解是准确的?或者可能比列出的选项有更好的方法来解决这个问题。
仅供参考 - 我为Curator/ZooKeeper编写了一个分布式任务调度程序。 https://github.com/NirmataOSS/workflow – Randgalt