当前位置: 首页 > 知识库问答 >
问题:

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

凌啸
2023-03-14

只是想知道是否有任何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事件。

LEADER不应该是微服务关闭节点。

共有3个答案

凌嘉勋
2023-03-14

我认为您需要通过以下代码向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")
      }
    })
柴英光
2023-03-14

根据文件记载,领导人选举是不同步的。这意味着,在你开始领导人选举后,领导人信息不一定立即可用。

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

不幸的是,我无法找到使用org/apache/curator/框架/食谱/领导者包中的类获取选举完成信息的干净方法:该应用编程接口仅提供检查领导层变更的方法。

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

new LeaderSelector(clientFramework, path, new NoOpLeaderSelectorListener())
    .getParticipants().stream()
    .filter(Participant::isLeader)
    .map(Participant::getId)
    .findAny()
    .ifPresent(<... do something with leader node Id ...>);

但我仍然不清楚这是否会比最初的变体更确定地产生正确的结果。

它将做的是:

  1. 使用进程间通信从框架中查询当前节点
  2. 使用配置的Sorter对节点进行排序
  3. 将排序后的第一个节点标记为该查询的领导节点

还有一个类似的查询:

new LeaderSelector(clientFramework, path, new NoOpLeaderSelectorListener())
  .getLeader()

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

高慈
2023-03-14

我认为当第三个实例开始时,LeaderLatch(第一,第二)的状态已经改变。

leaderLatch.hasLeadership()

应在足够多的实例(第3个)启动后执行。

或者注册一个回调方法

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

 类似资料:
  • 我再次需要一些Java帮助...我有这个简单的自定义节点类: 我需要实现一个静态布尔方法,该方法将两个节点作为参数,如果第一个节点的所有元素都包含在第二个节点中,则返回true。示例输出: 这是我的想法: 对于< code >节点p的每个元素,我必须检查它是否也在< code >节点q中。如果为真,我增加一个名为< code>count的整数,否则我什么也不做。一旦在所有p元素上完成了这个检查,我

  • 在我的应用程序中,我需要能够捕捉到编辑文本(editText)是否失去了焦点,我已经在java中找到了如何做到这一点,但在kotlin中我还不能找到如何做到这一点。 我找到的Java答案是: 有人能帮我把这个转换成kotlin吗?

  • 我正在创建kubernetes集群,其中包括:1个主节点(M1),2个工作节点(W1和W2) 使用部署创建副本数为5的吊舱。

  • 问题内容: 即使文件在远程http服务器上不存在,它也会以静默方式返回,它只是将html页面保存到命名文件中。例如: 即使abc.jpg在google.com服务器上不存在,它只是默默返回,生成的不是有效的jpg文件,它实际上是html页面。我猜返回的标头(一个httplib.HTTPMessage实例)可以用来实际上告诉检索是否成功,但是我找不到的任何文档。 有人可以提供有关此问题的一些信息吗?

  • 我在馆长2.12.0中使用动物园管理员。 通过使用watcher调用getChildren(我事先不知道完整的节点路径),我成功地监视了新节点,watcher再次提交任务以调用getChildren with watcher。现在我想看节点移除和仅移除。我打电话给守望者。但如果节点由于某种原因不存在,它实际上将是节点创建的观察者,在我的例子中,这是永远不会发生的。因此,我将留下越来越多的“鞭打”观

  • 在Android上有没有办法知道,如果运行我的代码的线程,是UI线程还是不是?在swing中,有来告诉我是否在UI线程上。安卓SDK里有什么功能让我知道这一点吗?