Apache Curator LeaderSelector: Как избежать отказа от лидерства, не выходя из метода takeLeadership()?

Я пытаюсь реализовать простую систему, основанную на выборах лидера, где моя основная бизнес-логика приложения выполняется на выбранном узле лидера. В рамках приобретения лидерства основной бизнес-логикой запускаются различные другие сервисы. Я использую рецепт Apache Curator LeaderSelector для реализации процесса выбора лидера.

В моей системе узел, который выбирается в качестве лидера, сохраняет лидерство до тех пор, пока сбой не заставит выбрать другого лидера. Другими словами, когда я получаю лидерство, я не хочу отказываться от него.

Согласно документации куратора LeaderSelection, лидерство освобождается, когда takeLeadership() метод возвращает. Я хочу избежать этого, и сейчас я просто блокирую возврат, вводя цикл ожидания.

Мой вопрос:

  1. Это правильный способ реализации лидерства?
  2. Является ли цикл ожидания (как показано в примере кода ниже) правильным способом блокировки?

    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();
            }
          }
        }
      }
    }
    

1 ответ

Решение

LeaderLatch Вместо функции wait() вы можете просто сделать:

Thread.currentThread().join();

Но да, это правильно.

Кстати, если вы предпочитаете другой метод, вы можете использовать LeaderLatch с LeaderLatchListener.

Другие вопросы по тегам