领导者选举与领导者闩锁

时间:2019-09-06 21:13:35

标签: spring-boot pivotal-cloud-foundry apache-curator

我正在尝试使用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)其他问题似乎暗示在这种情况下可能不会立即举行领导选举,从理论上讲,领导者可能永远不会竞选?我是否在正确地考虑这一点。 任何输入将不胜感激

1 个答案:

答案 0 :(得分:0)

该示例代码并不理想,但出于测试目的可能还可以。特别是,您想致电await(timeout, units)。请注意,但是这是一个阻塞的调用。如果您不想管理自己的线程/锁定,则可以改用LeaderSelector(请参见此处:https://github.com/apache/curator/tree/master/curator-examples/src/main/java/leader)。关于您的问题:

  1. 是的,将在您的客户中选出一位领导人
  2. 每个争夺领导权的客户最终都会得到成功。但是一次只能有1位领导者。如果领导者崩溃,则当其客户会话期满时,将选举另一个领导者。
  3. 样本代码的结构方式,几乎可以肯定,领导力永远无法实现。使用await(..., ...)LeaderSelector将解决此问题。

重要的是要了解,所有争夺领导权的客户最终都会成功。因此,您将需要其他某种信号来表明任务已运行。也许在完成后编写一个ZNode,以便其他客户端不再重复该任务。

如果您有兴趣,我为Curator和ZooKeeper编写了一个完整的任务计划框架,您可以使用它。看到这里:http://nirmata.github.io/workflow/