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

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

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

Согласно документации Curator 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();
            }
          }
        }
      }
    }
    

person sumeetkm    schedule 30.07.2014    source источник


Ответы (1)


LeaderLatchВместо ожидания() вы можете просто сделать:

Thread.currentThread().join();

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

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

person Randgalt    schedule 30.07.2014