我有两个进程在各自的JVM中运行(例如节点A和B)。它们连接到单个ZooKeeper服务器,以协调任务执行。任何一个节点(A或B)都应该一次执行一个scheduled task (freq 1 minute),而不是同时执行。此外,如果A失败,则B应接管,在下一个预定时间执行任务。
以下是问题
节点A赢得竞争,并在ZooKeeper上创建一些临时节点,以指示它已经开始执行task.Once A,它开始执行任务,它失去了与ZooKeeper的连接,因此ZooKeeper在一段时间后删除了该临时节点。由于意外的大数据量,执行超过了1分钟的边界。现在,当B醒来时,它将不会看到A先前创建的任何临时节点。在没有该节点的情况下,B认为没有其他节点正在执行任务,并且它也开始并行执行任务,这是错误的。A或B都应该运行这个任务。
我更喜欢A完成已启动的任务,即使它没有连接到ZooKeeper和B,在A完成任务之前也不会并行运行。
我正在使用org.I0Itec.zkclient.ZkClient客户端库。除了自定义的heartbeat机制之外,还有其他解决方案吗?
发布于 2015-07-26 00:01:33
另一个解决方案是有一个目录,其中包含正在执行的所有当前任务。当节点A完成执行任务T时,节点B已经开始执行任务T。现在,您可以做的是尝试杀死节点B并提交节点A产生的所有更改。这是推测执行原则的一个变化。如果节点A成功地执行了任务,则可以关闭节点B或放弃该节点所做的所有更改。
发布于 2015-07-23 20:28:22
如果设置了更高的会话超时,则B创建的临时节点不会被删除,B也不会执行任务。
确切地说,
https://stackoverflow.com/questions/31580177
复制相似问题