Java 策展人-如何知道当前节点是否为领导者

Java 策展人-如何知道当前节点是否为领导者,java,load-balancing,apache-zookeeper,apache-curator,Java,Load Balancing,Apache Zookeeper,Apache Curator,只是想知道是否有任何API知道在Curator框架中使用CuratorFramework类的特定节点是领导者。我正在使用LeaderLatch,但即使节点是leader(由Zookeeper框架选择),也无法工作 注意:在群集设置中配置了3个节点 Zookeeper框架将负责选择节点。我需要知道选定的策展人客户是否指向领导者 String zkConnString = "172.18.54.211:2181"; RetryPolicy retryPolicy = new Exponential

只是想知道是否有任何API知道在Curator框架中使用CuratorFramework类的特定节点是领导者。我正在使用LeaderLatch,但即使节点是leader(由Zookeeper框架选择),也无法工作

注意:在群集设置中配置了3个节点

Zookeeper框架将负责选择节点。我需要知道选定的策展人客户是否指向领导者

String zkConnString = "172.18.54.211:2181";

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework client1 = CuratorFrameworkFactory.newClient(zkConnString, retryPolicy);
client1.start();

 LeaderLatch leaderLatch = new LeaderLatch(client1, "/FirstNode");
 try {
    leaderLatch.start();

} catch (Exception e1) {
    e1.printStackTrace();
}

System.out.println("has leader ship ? "+leaderLatch.hasLeadership());
输出是

has leader ship ? false
用例如下所示。用例中涉及微型服务。

如果领导者对应的微服务失败,则需要选择其他领导者。每个微服务都可以被视为一个Z节点。如果删除Z节点,将触发并侦听NODEREMOVED事件

领导者不应该是微服务下节点。

根据,领导者选举是异步的。这意味着,在您开始领导人选举后,领导人信息不一定立即可用

你应该先等领导人选举完成

不幸的是,我无法使用
org/apache/curator/framework/recipes/leader
包中的类找到获取选举完成信息的干净方法:API只提供检查领导层变化的方法

我能找到的最接近的查询是(使用Java8):


第一个查询和第二个查询的区别在于,如果没有节点,则返回dummy participant is object,而第一个查询相对透明地返回
Optional.empty()
,如果没有节点。

我认为当第三个实例启动时,LeaderLatch(第一个、第二个)的状态已经改变

leaderLatch.hasLeadership()
应在足够的实例(第3个)启动后执行

或注册一个
回调方法


实现接口
LeaderLatchListener
并覆盖
isLeader()
notLeader()
是个好主意。

我相信您需要通过以下代码将侦听器添加到LeadLatch:

    leaderLatch.addListener(new LeaderLatchListener {
      override def isLeader(): Unit = {
        println(s"I am the lead $i")
      }

      override def notLeader(): Unit = {
        println(s"i am not the leader any more $i")
      }
    })

文档中的wait()方法。。导致当前线程等待,直到该实例获得领导地位,除非该线程被中断或关闭。因此,我将无法知道所选节点是否为领导者。实际上,这3个实例是在集群中配置的。编辑后的问题。@RamaKrishna.G,同意,我将删除这个答案,并对其进行更多的研究。非常感谢您花时间告诉我答案。谢谢@Prokhorov@RamaKrishna.G嗯,据我所知,我的答案的第一部分是正确的,但我无法找到任何方法来实际判断在领导人选举结束时是否有事件被触发。只有在领导层发生变化时才会发出通知,据该框架所知,未当选的非领导人选举参与者将无法登录。@Prokhorov,感谢您的评论。我有一个基本的疑问。在集群中设置节点时,将自动进行领导者选举。领队拉奇能做什么?使用这个,我可以编写我的领导人选举算法吗?或者是为了在框架选举领导人时获得通知?我认为大部分已经在基本zookeper算法中实现了。任何节点都可以监视另一个z节点,一旦某个先导下降,该z节点的观察者将成为先导。我不清楚什么是“领导者不应该是微服务宕机节点”,如果一个节点宕机,如果系统有法定人数,领导者将被选举。
leaderLatch.hasLeadership()
    leaderLatch.addListener(new LeaderLatchListener {
      override def isLeader(): Unit = {
        println(s"I am the lead $i")
      }

      override def notLeader(): Unit = {
        println(s"i am not the leader any more $i")
      }
    })