vko*_*lli 6 spring distributed-system spring-scheduled apache-zookeeper apache-curator
我们使用 Spring 来运行在单节点上运行良好的计划任务。我们希望在 N 个节点的集群中运行这些计划任务,以便在一个时间点最多由一个节点执行任务。这是针对企业用例的,我们可能期望多达 10 到 20 个节点。
我研究了各种选择:
我倾向于使用 #3,这似乎是一个安全的解决方案,假设 zookeeper 集成节点运行在一个单独的集群上,系统时钟使用 NTP 同步。这也是假设如果系统时钟同步,那么所有节点都有平等的机会获得锁来执行任务。
编辑:经过深思熟虑后,我意识到这可能不是一个安全的解决方案,因为系统时钟应该在运行计划任务的节点之间同步,而不仅仅是 Zookeeper 集群节点。我说不安全是因为运行任务的节点可能因 GC 暂停和其他原因而过载,并且时钟可能不同步。但我再次认为这是分布式系统的标准问题。
您能否告知我对每个选项的理解是否准确?或者可能有比列出的选项更好的方法来解决这个问题。
好吧,你可以像这样改进#3 。
Zookeeper提供观察者。也就是说,您可以在给定的 ZNode 上设置观察者(例如在 path 处/some/path)。集群中的所有节点都在监视同一个 Znode。每当节点认为(按计划或以任何方式)它现在应该运行计划任务时,
PERSISTENT_SEQUENTIAL子节点/some/path(所有节点都在监视该子节点)。另外,您可以根据需要设置该节点的数据。它可能是一个json 字符串,指定有关要运行的任务的详细信息。新的 ZNode 路径将如下所示/some/path/prefix_<sequence-number>。/some/path/prefix_<sequence-number>name下创建一个新的 ZNode success)该任务已执行。然后释放锁。success子节点。success这种设计通过检查给定 ZNode 下创建的名称为通知启动任务的子节点来确保没有任务运行两次。
我已将上述设计用于企业解决方案。实际上是一个分布式命令框架;-)
| 归档时间: |
|
| 查看次数: |
4200 次 |
| 最近记录: |