Seletor de líder curador do Apache:Como evitar desistir da liderança não saindo do método takeLeadership()?

StackOverflow https://stackoverflow.com//questions/25030262

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 é:

  1. Esta é a maneira certa de implementar liderança?
  2. 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();
            }
          }
        }
      }
    }
    
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top