Seletor de líder curador do Apache:Como evitar desistir da liderança não saindo do método takeLeadership()?
-
21-12-2019 - |
Pergunta
Estou tentando implementar um sistema simples baseado em eleição de líder, onde minha principal lógica de negócios do aplicativo é executada no nó do líder eleito.Como parte da aquisição de liderança, a lógica de negócio principal dá início a vários outros serviços.Estou usando a receita Apache Curator LeaderSelector para implementar o processo de seleção de líderes.
No meu sistema, o nó selecionado como líder mantém a liderança até que a falha force outro líder a ser selecionado.Em outras palavras, quando eu conseguir a liderança, não quero renunciar a ela.
De acordo com a documentação do Curator LeaderSelection, a liderança é abandonada quando o takeLeadership()
método retorna.Quero evitá-lo e agora estou apenas bloqueando o retorno introduzindo um loop de espera.
Minha pergunta é:
- Esta é a maneira certa de implementar liderança?
O loop de espera (conforme mostrado no exemplo de código abaixo) é o caminho certo para bloquear?
public class MainBusinessLogic extends LeaderSelectorListenerAdapter { private static final String ZK_PATH_LEADER_ROOT = "/some-path"; private final CuratorFramework client; private final LeaderSelector leaderSelector; public MainBusinessLogic() { client = CuratorService.getInstance().getCuratorFramework(); leaderSelector = new LeaderSelector(client, ZK_PATH_LEADER_ROOT, this); leaderSelector.autoRequeue(); leaderSelector.start(); } @Override public void takeLeadership(CuratorFramework client) throws IOException { // Start various other internal services... ServiceA serviceA = new ServiceA(...); ServiceB serviceB = new ServiceB(...); ... ... serviceA.start(); serviceB.start(); ... ... // We are done but need to keep leadership to this instance, else all the business // logic and services will start on another node. // Is this the right way to prevent relinquishing leadership??? while (true) { synchronized (this) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
Solução
LeaderLatchEm vez de wait(), você pode simplesmente fazer:
Thread.currentThread().join();
Mas, sim, está correto.
Aliás - se preferir um método diferente, você pode usar LeaderLatch com um LeaderLatchListener.