我正在尝试使用Leader Latch-Curator框架实施ZK Leader选举。为了便于讨论,假设我的PCF微服务分布在10个数据中心,时区中,并且调度程序以固定的时间间隔启动某些任务。在任何时候,只有一个实例需要成为领导者才能运行计划的作业。
我尝试使用星历节点实现自定义调度程序,但是Zookeeper节点每次都会抛出新问题。我没有重新发明轮子,而是决定使用策展人框架来解决这个问题。下面的代码逐字复制了https://github.com/yiming187/curator-example/blob/master/src/main/java/com/ctrip/zk/curator/example/LeaderLatchExample.java
的一些修改CuratorFramework client = null;
LeaderLatch example = null;
try {
client = CuratorFrameworkFactory.newClient(zkConnString, new ExponentialBackoffRetry(1000, 3));
example = new LeaderLatch(client, PATH, "Client #"+ i);
client.start();
example.start();
if (example.hasLeadership()) {
//Since I'm the leader finish processing
}
else {
LOGGER.info("Not elected leader, democracy is overrated !!!");
}
}
catch(Exception e) {
e.printStackTrace();
}
finally {
System.out.println("Shutting down...");
CloseableUtils.closeQuietly(example);
CloseableUtils.closeQuietly(client);
}
这样做,我想验证一下:
1)是否会在10个实例中选出一位领导人?
2)我的领导者处理是幂等的,当当前领导者去世时,是否由另一个领导者接管也没关系。尽管我通过排列代码的方式猜测,当当前的领导者在处理过程中被打断时,其他潜在的领导者将已经死亡。我了解这个正确吗?
3)其他问题似乎暗示在这种情况下可能不会立即举行领导选举,从理论上讲,领导者可能永远不会竞选?我是否在正确地考虑这一点。
任何输入将不胜感激
答案 0 :(得分:0)
该示例代码并不理想,但出于测试目的可能还可以。特别是,您想致电await(timeout, units)
。请注意,但是这是一个阻塞的调用。如果您不想管理自己的线程/锁定,则可以改用LeaderSelector
(请参见此处:https://github.com/apache/curator/tree/master/curator-examples/src/main/java/leader)。关于您的问题:
await(..., ...)
或LeaderSelector
将解决此问题。重要的是要了解,所有争夺领导权的客户最终都会成功。因此,您将需要其他某种信号来表明任务已运行。也许在完成后编写一个ZNode,以便其他客户端不再重复该任务。
如果您有兴趣,我为Curator和ZooKeeper编写了一个完整的任务计划框架,您可以使用它。看到这里:http://nirmata.github.io/workflow/