Апач-куритор-лидер: Как избежать отказа от лидерства, не выходя из метода Takeleavership ()?
-
21-12-2019 - |
Вопрос
Я пытаюсь осуществить простую систему лидера, основанную на выборах, где моя основная бизнес-логика приложения работает на избранном узле лидера.В рамках приобретения лидерства основная деловая логика начинает различные другие услуги.Я использую рецепт лидервектора куратора Apache для реализации процесса выбора лидера.
В моей системе узел, который выбирается в качестве лидера, держит руководство до тех пор, пока неудача не застраховала другого лидера.Другими словами, как только я получу лидерство, я не хочу его отказаться.
Согласно документации на лидерство куратора, руководство отказывается при возврате метода 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(); } } } } }
Решение
leaderlatchinstead of ждать (), вы можете просто сделать:
Thread.currentThread().join();
.
Но да, это правильно.
BTW - если вы предпочитаете другой метод, вы можете использовать Senlelatch с LechnlatchListener.