小编vko*_*lli的帖子

使用zookeeper在集群中调度任务

我们使用 Spring 来运行在单节点上运行良好的计划任务。我们希望在 N 个节点的集群中运行这些计划任务,以便在一个时间点最多由一个节点执行任务。这是针对企业用例的,我们可能期望多达 10 到 20 个节点。

我研究了各种选择:

  1. 使用 Quartz,它似乎是在集群中运行计划任务的流行选择。缺点:我想避免的数据库依赖。
  2. 使用 zookeeper 并始终仅在领导者/主节点上运行计划任务。缺点:任务执行负载没有分布
  3. 使用 zookeeper 并在所有节点上调用计划任务。但是在任务运行之前获取分布式锁并在执行完成后释放。缺点:所有节点上的系统时钟应该同步,如果应用程序过载导致系统时钟漂移,这可能是一个问题。
  4. 使用zookeeper,让主节点按照时间表继续生成任务,并将其分配给随机工作者。如果先前的计划任务尚未处理,则不会分配新任务。缺点:这似乎增加了太多的复杂性。

我倾向于使用 #3,这似乎是一个安全的解决方案,假设 zookeeper 集成节点运行在一个单独的集群上,系统时钟使用 NTP 同步。这也是假设如果系统时钟同步,那么所有节点都有平等的机会获得锁来执行任务。
编辑:经过深思熟虑后,我意识到这可能不是一个安全的解决方案,因为系统时钟应该在运行计划任务的节点之间同步,而不仅仅是 Zookeeper 集群节点。我说不安全是因为运行任务的节点可能因 GC 暂停和其他原因而过载,并且时钟可能不同步。但我再次认为这是分布式系统的标准问题。

您能否告知我对每个选项的理解是否准确?或者可能有比列出的选项更好的方法来解决这个问题。

spring distributed-system spring-scheduled apache-zookeeper apache-curator

6
推荐指数
1
解决办法
4200
查看次数