【发布时间】:2015-10-13 08:01:51
【问题描述】:
我有两个进程在各自的 JVM 中运行(比如节点 A 和 B)。它们连接到单个 ZooKeeper 服务器以协调任务执行。任何一个节点(A 或 B)都应一次执行 scheduled task (freq 1 minute),而不是同时执行。此外,如果 A 失败,则 B 应在下一个预定时间接管执行任务。
以下是问题:
节点 A 赢得比赛并在 ZooKeeper 上创建一些临时节点以表明它已开始执行任务。一旦 A 开始执行任务,它就会失去与 ZooKeeper 的连接,因此 ZooKeeper 会在一段时间后删除临时节点。由于意外的更大数据量,执行超过了 1 分钟边界。现在当 B 醒来时,它不会看到 A 之前创建的任何临时节点。在没有该节点的情况下,B 认为没有其他节点正在执行该任务,并且它也开始与disconnected A 并行执行该任务,这是错误的。 A 或 B 应该运行该任务。
我更喜欢 A 完成启动的任务,即使它没有连接到 ZooKeeper 并且 B 在 A 完成任务之前不会并行运行。
我正在使用org.I0Itec.zkclient.ZkClient 客户端库。除了自定义heartbeat机制,还有什么解决办法吗?
【问题讨论】:
-
我认为您的解决方案应该取决于您是希望 A 完成已启动的任务还是确保 B 能够在下次启动时运行。
-
@OlegKomarov 你说得对,我忘了说。现在将其添加到问题陈述中。
标签: java apache-zookeeper distributed-system orchestration