Apache Curateur Leaderselector: Comment éviter d'abandonner le leadership en ne sortant pas de la méthode TakEleader ()?

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

Question

J'essaie de mettre en œuvre un système basé sur les élections de leader simples où ma principale logique commerciale de l'application s'exécute sur le nœud de leader élu.Dans le cadre de l'acquisition de leadership, la principale logique commerciale commence divers autres services.J'utilise la recette duaderselector Apache Curateur pour mettre en œuvre le processus de sélection du leader.

Dans mon système, le nœud qui est sélectionné comme leader maintient le leadership jusqu'à ce que l'échec oblige un autre chef de file à sélectionner.En d'autres termes, une fois que je reçois le leadership, je ne veux pas le renoncer.

Selon la documentation du dirigeants de conservateur, le leadership est abandonné lorsque la méthode takeLeadership() revient.Je veux l'éviter, et je suis en ce moment, bloquez simplement le retour en introduisant une boucle d'attente.

Ma question est la suivante:

  1. Est-ce la bonne façon de mettre en œuvre le leadership?
  2. est la boucle d'attente (comme indiqué dans l'exemple de code ci-dessous) la bonne façon de bloquer?

    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();
            }
          }
        }
      }
    }
    
Était-ce utile?

La solution

LeaderLatchInstead de l'attente (), vous pouvez simplement faire:

Thread.currentThread().join();

Mais, oui, c'est correct.

BTW - Si vous préférez une méthode différente, vous pouvez utiliser leaderLatch avec un leaderLatchlistener.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top