Apache Curator LeaderSelector: Как избежать отказа от лидерства, не выходя из метода takeLeadership()?
Я пытаюсь реализовать простую систему, основанную на выборах лидера, где моя основная бизнес-логика приложения выполняется на выбранном узле лидера. В рамках приобретения лидерства основной бизнес-логикой запускаются различные другие сервисы. Я использую рецепт Apache Curator LeaderSelector для реализации процесса выбора лидера.
В моей системе узел, который выбирается в качестве лидера, сохраняет лидерство до тех пор, пока сбой не заставит выбрать другого лидера. Другими словами, когда я получаю лидерство, я не хочу отказываться от него.
Согласно документации куратора LeaderSelection, лидерство освобождается, когда takeLeadership()
метод возвращает. Я хочу избежать этого, и сейчас я просто блокирую возврат, вводя цикл ожидания.
Мой вопрос:
- Это правильный способ реализации лидерства?
Является ли цикл ожидания (как показано в примере кода ниже) правильным способом блокировки?
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.