Selector de líder curador de Apache:¿Cómo evitar renunciar al liderazgo al no salir del método takeLeadership()?

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

Pregunta

Estoy intentando implementar un sistema simple basado en la elección de líder donde mi lógica comercial principal de la aplicación se ejecuta en el nodo líder elegido.Como parte de la adquisición de liderazgo, la lógica empresarial principal inicia varios otros servicios.Estoy usando la receta Apache Curator LeaderSelector para implementar el proceso de selección de líderes.

En mi sistema, el nodo que es seleccionado como líder mantiene el liderazgo hasta que el fallo obliga a seleccionar otro líder.En otras palabras, una vez que obtenga el liderazgo no quiero renunciar a él.

Según la documentación de Curator LeaderSelection, el liderazgo se abandona cuando el takeLeadership() el método regresa.Quiero evitarlo y ahora solo estoy bloqueando el retorno introduciendo un bucle de espera.

Mi pregunta es:

  1. ¿Es esta la forma correcta de implementar el liderazgo?
  2. ¿Es el bucle de espera (como se muestra en el ejemplo de código siguiente) la forma correcta de 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();
            }
          }
        }
      }
    }
    
¿Fue útil?

Solución

LeaderLatchEn lugar de esperar(), puedes simplemente hacer:

Thread.currentThread().join();

Pero sí, eso es correcto.

Por cierto, si prefiere un método diferente, puede usar LeaderLatch con LeaderLatchListener.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top