Selettore leader del curatore Apache:Come evitare di rinunciare alla leadership non uscendo dal metodo takeLeadership()?

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

Domanda

Sto cercando di implementare un semplice sistema basato sull'elezione del leader in cui la mia logica aziendale principale dell'applicazione viene eseguita sul nodo del leader eletto.Nell'ambito dell'acquisizione della leadership, la logica aziendale principale avvia vari altri servizi.Sto utilizzando la ricetta Apache Curator LeaderSelector per implementare il processo di selezione del leader.

Nel mio sistema, il nodo che viene selezionato come leader mantiene la leadership fino a quando il fallimento non costringe a selezionare un altro leader.In altre parole, una volta ottenuta la leadership non voglio rinunciarvi.

Secondo la documentazione del curatore LeaderSelection, la leadership viene abbandonata quando il takeLeadership() il metodo restituisce.Voglio evitarlo e in questo momento mi basta bloccare il reso introducendo un ciclo di attesa.

La mia domanda è:

  1. È questo il modo giusto per implementare la leadership?
  2. Il ciclo di attesa (come mostrato nell'esempio di codice seguente) è il modo giusto per bloccare?

    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();
            }
          }
        }
      }
    }
    
È stato utile?

Soluzione

LeaderLatch Invece di wait(), puoi semplicemente fare:

Thread.currentThread().join();

Ma sì, è corretto.

A proposito: se preferisci un metodo diverso, puoi utilizzare LeaderLatch con un LeaderLatchListener.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top