我试图了解如何使用Consul进行应用程序领导者选举.我正在使用java consul-client中的LeaderElectionUtil.
我可以选出一个领导者,并且所有节点都同意领导者但是如果领导者应用程序死亡,其他节点似乎没有意识到并且在调用getLeaderInfoForService时继续让死去的领导者 - 即没有新的领导选举发生.
领导者电子指南(https://www.consul.io/docs/guides/leader-election.html)提到:
"请注意,默认情况下会话仅使用八卦故障检测器.也就是说,只要默认的Serf运行状况检查未声明节点运行状况不佳,会话就会被视为保持.如果需要,可以指定其他检查. "
因此,我假设我可能需要向会话添加应用程序级别运行状况检查(TTL等),以便在应用程序失败时会话将失效?这是正确的想法,如果有的话,有没有办法通过Java客户端这样做?我可以放弃LeaderElectionUtil并编写我的代码来选举一个领导者,但似乎甚至在SessionClient中也没有办法创建一个与之相关的健康检查的会话?
或者可能有更好的方法来实现这一点(领导者重选的应用程序级故障检测)?我有点卡住所以任何指针都会受到赞赏.
所以我解决了它以防其他人遇到这个问题。
我无法使用 LeaderElectionUtil,但我创建了自己的类来执行相同的操作,但在 createSession 方法中我添加了 10 秒的 TTL。
private String createSession(String serviceName) {
final Session session =
ImmutableSession.builder().name(serviceName).ttl("10s").build();
return client.sessionClient().createSession(session).getId();
}
Run Code Online (Sandbox Code Playgroud)
为了使其工作,您需要有一个后台线程,该线程至少每 10 秒在会话上调用一次 renewSession。
归档时间: |
|
查看次数: |
1447 次 |
最近记录: |