您可以使用实现共识协议的解决方案。假设 - 例如 - 群集中的所有节点都可以使用Raft protocol进行通信。因此,每当节点X想要开始处理任务Y时,它将尝试提交消息X starts working on Y
。一旦这些消息被提交到日志中,所有节点将以相同的顺序在日志中看到所有消息。
当节点X结束或中止它会尝试提交X no longer works on Y
,以便其他节点可以开始/继续工作任务。
是可能发生的两个节点(X和Z)可以尝试提交他们的同时开始邮件,然后日志会是这个样子:
...
N-1: ...
N+0: "X starts working on Y"
...
N+k: "Z starts working on Y"
...
但因为没有X no longer works on Y
消息在N + 0和N + k条目之间,每个节点(包括Z)都知道Z不能在Y上开始工作。
剩下的唯一问题是如果节点X从集群中分割出来,试图犯下我认为存在的X no longer works on Y
完美的解决方案。
解决办法可能是X会尝试定期提交消息X still works on Y at time T
,并且如果在某个阈值持续时间内没有将这样的消息提交到日志中,那么集群会认为没有人再继续处理该任务。
有了这个工作,但是周围,你会允许两个或多个节点将在同一个任务(分区节点X和超时后拿起任务了一些新的节点)工作的可能性。