Sto utilizzando la libreria Apache Curator per l'elezione della leadership sul Zookeeper. Ho il mio codice applicazione distribuito in varie macchine e ho bisogno di eseguire il mio codice solo da una macchina, ecco perché sto facendo elezioni al comando del guardiano in modo da poter controllare se sono il leader, quindi eseguire questo codice.Come utilizzare la ricetta LeaderElection in modo efficiente usando Curator per Zookeeper?
Qui di seguito è la mia classe che LeaderElectionExecutor
fa in modo che sto avendo un'istanza Curatore per applicazione
public class LeaderElectionExecutor {
private ZookeeperClient zookClient;
private static final String LEADER_NODE = "/testleader";
private static class Holder {
static final LeaderElectionExecutor INSTANCE = new LeaderElectionExecutor();
}
public static LeaderElectionExecutor getInstance() {
return Holder.INSTANCE;
}
private LeaderElectionExecutor() {
try {
String hostname = Utils.getHostName();
String nodes = "host1:2181,host2:2181;
zookClient = new ZookeeperClient(nodes, LEADER_NODE, hostname);
zookClient.start();
// added sleep specifically for the leader to get selected
// since I cannot call isLeader method immediately after starting the latch
TimeUnit.MINUTES.sleep(1);
} catch (Exception ex) {
// logging error
System.exit(1);
}
}
public ZookeeperClient getZookClient() {
return zookClient;
}
}
E sotto è il mio codice ZookeeperClient
-
// can this class be improved in any ways?
public class ZookeeperClient {
private CuratorFramework client;
private String latchPath;
private String id;
private LeaderLatch leaderLatch;
public ZookeeperClient(String connString, String latchPath, String id) {
client = CuratorFrameworkFactory.newClient(connString, new ExponentialBackoffRetry(1000, Integer.MAX_VALUE));
this.id = id;
this.latchPath = latchPath;
}
public void start() throws Exception {
client.start();
leaderLatch = new LeaderLatch(client, latchPath, id);
leaderLatch.start();
}
public boolean isLeader() {
return leaderLatch.hasLeadership();
}
public Participant currentLeader() throws Exception {
return leaderLatch.getLeader();
}
public void close() throws IOException {
leaderLatch.close();
client.close();
}
public CuratorFramework getClient() {
return client;
}
public String getLatchPath() {
return latchPath;
}
public String getId() {
return id;
}
public LeaderLatch getLeaderLatch() {
return leaderLatch;
}
}
Ora nella mia domanda, sto usando la codice come questo -
public void method01() {
ZookeeperClient zookClient = LeaderElectionExecutor.getInstance().getZookClient();
if (zookClient.isLeader()) {
// do something
}
}
public void method02() {
ZookeeperClient zookClient = LeaderElectionExecutor.getInstance().getZookClient();
if (zookClient.isLeader()) {
// do something
}
}
Problem Statement: -
Nella libreria di Curator - Chiamare lo isLeader()
immediatamente dopo l'avvio del latch non funzionerà. Ci vuole tempo prima che il leader venga selezionato. E solo per questo motivo, ho aggiunto un sonno di 1 minuto nel mio codice LeaderElectionExecutor
che funziona bene, ma credo che non sia il modo giusto per farlo.
C'è un modo migliore per farlo? Tenendo presente questo, ho bisogno di un modo per verificare se sono il leader quindi eseguire questo pezzo di codice. Non posso fare tutto in un unico metodo, quindi ho bisogno di chiamare il metodo isLeader
da diverse classi e metodi per verificare se sono il leader, quindi eseguire solo questa parte di codice.
Sto usando Zookeeper 3.4.5 e versione di Curator 1.7.1.