我试图让我了解如何使用Consul进行应用程序领导者选举。我正在使用java consul-client中的LeaderElectionUtil。

我可以选择一个领导者,并且所有节点都同意该领导者,但是如果领导者应用程序死亡,则其他节点似乎不知道,并且在调用getLeaderInfoForForService时继续保持死亡的领导者-即,不会进行新的领导者选举。

《领导者选拔指南》(https://www.consul.io/docs/guides/leader-election.html)提到:

“请注意,默认情况下,该 session 仅使用八卦故障检测器。也就是说,只要默认的Serf健康检查未宣布该节点不健康,就认为该 session 已由节点保持。可以根据需要指定其他检查。 ”

因此,据此我假设可能需要向 session 添加应用程序级别的运行状况检查(TTL等),以便当应用程序失败时该 session 将无效。这是正确的主意吗?如果是,有什么办法可以通过Java客户端来做到这一点?我可以放弃LeaderElectionUtil并编写代码来选举一位领导者,但是,即使在SessionClient中,似乎也没有办法创建与运行状况检查相关联的 session ?

或者,也许有更好的方法来实现这一点(针对领导者连任的应用程序级别故障检测)?我有点卡住,所以任何指针都将不胜感激。

最佳答案

所以我解决了这个问题,以防其他任何人遇到这个问题。

我无法使用LeaderElectionUtil,但是我创建了自己的类来做同样的事情,但是在createSession方法中,我添加了10s的TTL。

private String createSession(String serviceName) {
    final Session session =
ImmutableSession.builder().name(serviceName).ttl("10s").build();

return client.sessionClient().createSession(session).getId();
}

为了使其正常工作,您将需要有一个后台线程,该线程至少每10秒在 session 上调用一次renewSession。

关于consul - 使用Java consul-client进行应用程序领导者选举,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36417744/

10-16 12:51